使用Rust更新MongoDB中的数据

时间:2017-09-01 00:10:00

标签: mongodb rust

我正在尝试使用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看起来像这样。

db.DEVICES.find()

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

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

2 个答案:

答案 0 :(得分:2)

你几乎就在那里。当我尝试你的例子时,以下内容为我编译并运行(提示:你没有附上" $ 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();
}

另一条建议:使用unwrap而不是expect可能会给您更准确的错误。

至于使用mongodb库,我已经远离那个,因为作者明确地说它not production ready甚至文档中的update_one示例都被破坏了。

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

答案 1 :(得分:1)

如果有人正在寻找更新版本驱动程序的答案,这里是基于@PureW 在异步版本中的答案:

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

async 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).await.unwrap();
}