我有一个名为'profiles_bak'的集合。我想更新'profiles_bak'中的每个文档。对于单一条件,下面提到的代码工作正常
db.profiles_bak.update(
{$where : "this.value1 > this.value2"},
{$set : {"Gender": "male" }},false,true)
但是我必须根据多个条件进行更新,我还提到了我到目前为止使用的代码,或者其他任何方法我如何才能实现这一目标。
db.profiles_bak.update( { $and: [
{query: { $where : "this.value1 > this.value2" },
update: { $set : {"Gender": "male" }},false,true},
{query: { $where : "this.value1 < this.value2" },
update: { $set : {"Gender": "female" }},false,true}
]})
答案 0 :(得分:1)
你做不到。虽然您可以使用JavaScript评估构造表达式,但它不能“更改”语句的“更新”块中的选定结果。查询逻辑与更新语句块分离,并且该语句块只能根据满足的查询条件执行完全单一操作。
这些是“两个”更新语句。使用Bulk Operations API提高效率:
var bulk = db.profiles_bak.initializeUnorderedBulkOp();
bulk.find({ "$where": "this.value1 > this.value2" }).update({
"$set": { "Gender": "male" }
});
bulk.find({ "$where": "this.value1 < this.value2" }).update({
"$set": { "Gender": "female" }
});
bulk.execute();
至少这是向服务器发出一个请求的一个请求。
批量中的.update()始终设置为“多个”。