将HashMap编码为bson时的InvalidMapKeyType

时间:2017-06-11 10:58:00

标签: rust bson

我想使用HashMap<u64, usize>bson::to_bson()进行编码,以便将其存储在MongoDB中。

当我运行代码时,它惊慌失措并告诉我InvalidMapKeyType(FloatingPoint(....))。我不能用这种方法来编码这种类型的HashMap吗?

1 个答案:

答案 0 :(得分:1)

BSON library disallows all keys that are not stringsBSON spec表示文档是元素序列,每个元素必须以名称开头,名称只能是字符串。

更改HashMap以使用字符串作为键可以解决问题。

你的问题对我没有任何意义。您声明自己拥有HashMap<u64, usize>,但由于FloatingPoint,您的错误代码段表明它已出现!

这就是为什么你应该总是创建一个MCVE然后在提问时提供它。我创建了这个样本,完全按照你的说法完成,我得到了一个不同的错误:

extern crate bson; // 0.8.0

use std::collections::HashMap;

fn main() {
    let mut thing = HashMap::new();
    thing.insert(0_u64, 1_usize);

    match bson::to_bson(&thing) {
        Ok(e) => println!("{:?}", e),
        Err(e) => println!("Got an error: {:?}, {}", e, e),
    }
}
Got an error: UnsupportedUnsignedType, BSON does not support unsigned type

如果我将HashMap更改为已签名的数字,那么我会得到同一类错误:

thing.insert(0_i64, 1_isize);
Got an error: InvalidMapKeyType(I64(0)), Invalid map key type: I64(0)

你甚至不能使用HashMap作为Rust中的密钥来f64,因为它没有实现HashEq,所以我不知道你是如何得到这个特定错误的。