2017-09-01 2 views
1

Ich versuche, ein Feld in einer Sammlung einer MongoDB-Datenbank mit Rust zu aktualisieren. Ich war mit diesem Code:Aktualisieren von Daten in MongoDB mit Rust

extern crate mongodb; 

use mongodb::{Client, ThreadedClient}; 
use mongodb::db::ThreadedDatabase; 

fn main() { 
    let client = Client::connect("ipaddress", 27017); 

    let coll = client.db("DEV").collection("DEV"); 
    let film_a = doc!{"DEVID"=>"1"}; 
    let filter = film_a.clone(); 
    let update = doc!{"temp"=>"5"}; 

    coll.update_one(filter, update, None).expect("failed"); 
} 

Das gibt mir eine Fehlermeldung, Update nur mit dem $ Bediener arbeiten, die nach einiger Suche scheint zu bedeuten, soll ich $set verwenden. Ich habe verschiedene Versionen von diesem versucht, aber nur nicht übereinstimmende Typfehler und so erhalten.

coll.update_one({"DEVID": "1"},{$set:{"temp" => "5"}},None).expect("failed"); 

Wohin gehe ich falsch?

Die DB sieht so aus.

db.DEVICES.find() 

{ "_id" : ObjectId("59a7bb747a1a650f1814ef85"), "DEVID" : 1, "temp" : 0, 
"room_temp" : 0 } 

{ "_id" : ObjectId("59a7bb827a1a650f1814ef86"), "DEVID" : 2, "temp" : 0, 
"room_temp" : 0 } 

Antwort

1

Sie sind ziemlich viel da. Die folgenden kompiliert und läuft für mich, wenn ich versuche, Ihr Beispiel (Tipp: Sie haben nicht in Anführungszeichen „$ set“):

#[macro_use(bson, doc)] 
extern crate bson; 
extern crate mongodb; 

use mongodb::{Client, ThreadedClient}; 
use mongodb::db::ThreadedDatabase; 

fn main() { 
    let client = Client::connect("localhost", 27017).unwrap(); 

    let coll = client.db("tmp").collection("tmp"); 
    let filter = doc!{"DEVID"=>"1"}; 
    let update = doc!{"$set" => {"temp"=>"5"}}; 

    coll.update_one(filter, update, None).unwrap(); 
} 

Ein weiterer Ratschlag: Mit unwrap anstatt expect könnte Ihnen präzisere Fehler.

Wie für die Verwendung der Mongodb-Bibliothek, habe ich davon Abstand gehalten, wie die Autoren ausdrücklich sagen, es ist not production ready und sogar das update_one Beispiel in ihrer Dokumentation ist gebrochen.

Stattdessen habe ich die wrapper over the battle-tested C-library mit guten Ergebnissen verwendet.

+0

Ich habe versucht, das Set in Anführungszeichen und eine Menge anderer Sachen und es funktioniert immer noch nicht, ich denke, es ist nur gebrochen. Ich habe angefangen, den C-Wrapper zu benutzen, aber sie haben keine Beispiele und ich bin noch ziemlich neu dazu. – dmnte

+0

Der Code, den ich oben eingefügt habe, kompiliert und läuft auf Rustc 1.19. – PureW

+0

der Code kompiliert und läuft für mich auch, aber ändert nicht das Feld, im Code im mit "1" aber in der db ist es nur 1. ist das wichtig? – dmnte