2017-06-11 4 views
-2

Ich möchte eine HashMap<u64, usize> mit bson::to_bson() codieren, um es in MongoDB zu speichern.InvalidMapKeyType beim Codieren einer HashMap zu bson

Als ich den Code lief, geriet es in Panik und sagte mir, dass InvalidMapKeyType(FloatingPoint(....)). Kann ich diese Methode nicht verwenden, um HashMap in einem solchen Typ zu codieren?

+0

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. –

+0

@NeilLunn Vielen Dank! – YjyJeff

Antwort

1

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.