2017-09-01 235 views
1

我試圖使用Rust更新MongoDB數據庫集合中的字段。我用這個代碼:使用Rust更新MongoDB中的數據

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"); 
} 

這給了我一個錯誤說只更新與$運營商,經過一番搜索,似乎意味着我應該使用$set工作。我一直在嘗試不同的版本,但只能得到不匹配的類型錯誤等。

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

我哪裏錯了?

數據庫看起來像這樣。

db.DEVICES.find() 

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

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

回答

1

你幾乎在那裏。對我來說,下面的編譯和運行,當我嘗試你的榜樣(提示:您還沒有加括號「$集」):

#[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(); 
} 

另一個忠告:使用unwrap而不是expect可能會給你更精確錯誤。

至於使用mongodb庫,我已經遠離,因爲作者明確指出它的文檔中的not production ready甚至update_one示例已被破壞。

相反,我用wrapper over the battle-tested C-library,結果很好。

+0

我試圖用引號和其他一些東西括起來,它仍然不會工作,我開始認爲它剛剛壞了。我開始嘗試使用C封裝,但他們沒有任何例子,我仍然很新。 – dmnte

+0

我上面粘貼的代碼編譯並運行在Rustc 1.19上。 – PureW

+0

代碼也爲我編譯和運行,但並沒有改變字段,在代碼即時通訊使用「1」,但在數據庫它只是1.這是否重要? – dmnte