我正在尝试使用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 }
答案 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();
}