Die BSON library disallows all keys that are not strings. Die BSON spec besagt, dass ein Dokument eine Sequenz von Elementen ist, jedem Element muss ein Name vorangestellt werden und ein Name darf nur eine Zeichenfolge sein.
Ändern Sie Ihre HashMap
, um eine Zeichenfolge als Schlüssel zu verwenden, sollte das Problem lösen.
Ihre Frage ergibt keinen Sinn für mich. Sie geben an, dass Sie eine HashMap<u64, usize>
haben, aber Ihr Fehler-Snippet gibt an, dass es sich um eine FloatingPoint
handelt!
Deshalb sollten Sie immer ein MCVE erstellen und es dann bereitstellen, wenn Sie eine Frage stellen. Ich habe diese Probe, die genau das tut, wie Sie sagten, und ich bekomme einen anderen Fehler:
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
Wenn ich die HashMap
zu Zahlen mit Vorzeichen zu ändern, dann habe ich die gleiche Klasse von Fehlermeldung erhalten:
thing.insert(0_i64, 1_isize);
Got an error: InvalidMapKeyType(I64(0)), Invalid map key type: I64(0)
Sie können nicht einmal ein HashMap
machen ein f64
als Schlüssel in Rust verwenden, da es nicht Hash
odernicht implementiert 210, also habe ich keine Ahnung, wie Sie diesen spezifischen Fehler bekommen haben.
Java stößt häufig auf ein ähnliches Problem. BSON-Objekte erwarten, dass der "Hash-Schlüssel" ein "String" ist, und das ist im Grunde, wie er gespeichert wird. Sie würden tun, um an diesem Typ in Ihrem Design zu bleiben, oder zumindest vor der Umwandlung in BSON zuerst zu werfen. –
@NeilLunn Vielen Dank! – YjyJeff