MongoDB更新条件

时间:2016-04-18 15:41:00

标签: mongodb database

我正在尝试根据条件更新我的收藏中的某个字段。

如果条件为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运算符可供更新。

我有什么选择将此更新作为单个命令执行?

6 个答案:

答案 0 :(得分:9)

如果你有MongoDB版本3.2 +

,可以使用findAndModify()findOneAndUpdate()有条件地更新MongoDB文档

答案 1 :(得分:6)

你不能。

Mongo不支持在update语句中组合字段,条件等。

答案 2 :(得分:3)

Mongo 4.2db.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 });