我正在尝试根据条件更新我的收藏中的某个字段。
如果条件为active
,我想将字段true
设置为true
,否则设置为false
这是无条件更新
db.consent.update(
{}, //match all
{
$set: {
"active": true
}
},
{
multi: true,
}
)
我想像这样添加更新条件:
db.consent.update(
{},
$cond: {
if: {
$eq: ["_id", ObjectId("5714ce0a4514ef3ef68677fd")]
},
then: {
$set: {
"active": true
}
},
else: {
$set: {
"active": false
}
}
},
{
multi: true,
}
)
根据https://docs.mongodb.org/manual/reference/operator/update-field/,没有$cond
运算符可供更新。
我有什么选择将此更新作为单个命令执行?
答案 0 :(得分:9)
答案 1 :(得分:6)
你不能。
Mongo不支持在update语句中组合字段,条件等。
答案 2 :(得分:3)
以Mongo 4.2
,db.collection.update()
开始可以接受聚合管道,最终允许基于另一个字段来更新/创建一个字段:
// { a: "Hello", b: "World" }
// { a: "Olleh", b: "Dlrow" }
db.collection.update(
{},
[ { $set: { active: { $eq: [ "$a", "Hello" ] } } } ],
{ multi: true }
)
// { a: "Hello", b: "World", active: true }
// { a: "Olleh", b: "Dlrow", active: false }
第一部分{}
是匹配查询,用于过滤要更新的文档(在本例中为所有文档)。
第二部分[ { $set: { active: { $eq: [ "$a", "Hello" ] } } } ]
是更新聚合管道(请注意方括号表示使用聚合管道)。 $set
是新的聚合运算符,别名为$addFields
。然后,可以在$set
阶段使用任何聚合运算符;在我们的案例中,条件等式检查取决于新active
字段要使用的值。
不要忘记{ multi: true }
,否则只会更新第一个匹配的文档。
答案 3 :(得分:2)
db.consent.update(
{
//YOUR CONDITIONAL HERE TO APLLAY UPDATE ONLY IF CONDITIONAL HAPPEN, SO THE "active": true WILL BE APPLY.
},
{
$set: {
"active": true,
"active2": FALSE,
}
},
{
multi: true,
}
)
答案 4 :(得分:2)
我们可以使用聚合管道来做到这一点。在这里,我将男性更新为女性,将女性更新为男性。
db.customer.updateMany(
{ },
[
{ $set: { gender: { $switch: {
branches: [
{ case: { $eq: [ "$gender", 'male' ] }, then: "female" },
{ case: { $eq: [ "$gender", 'female' ] }, then: "male" }
],
default: ""
} } } }
]
)
答案 5 :(得分:1)
当然可以。 通过运行2个查询
a.out 2 6
您的示例案例
db.collection.update({condition}, { $set: { state } }, { multi: true });
db.collection.update({!condition}, { $set: { state } }, { multi: false });