mongodb在文档更新期间使用if else设置字段值

时间:2015-05-21 22:53:03

标签: javascript node.js mongodb mongoose

在mongodb中是否有办法在更新期间使用if / else设置字段值。 我知道我可以使用find,返回文档,循环遍历它们,并对每个文档进行if / else检查,并为每个文档创建一个新的保存查询。

然而,如果有办法一次性有条件地更新,这似乎是浪费。

是否可以有条件地设置字段值,例如

Documents.update(
    {some_condition: true}, 
    {$set: {"status": 
        {$cond: 
              {if  : {"some field": "some condition"}},
              {then:  "value 1"} ,
              {else: "value 2"} 
        } 
    }} 
)

(我知道$ condis用于聚合,我在这里用它作为我想到的一个例子。)

2 个答案:

答案 0 :(得分:4)

MongoDB不支持您正在寻找的那种条件更新。但是,您仍然可以比使用查找,循环和保存方法做得更好。

将条件检查移至update查询选择器,然后发出两个更新(每种情况一个),使用{multi: true}将更新应用于所有匹配的文档。

// Start with the "if" update
Documents.update(
    {some_condition: true, "some field": "some condition"}, 
    {$set: {"status": "value 1"}},
    {multi: true},
    function(err, numAffected) {
        // Now do the "else" update, using $ne to select the rest of the docs
        Documents.update(
            {some_condition: true, "some field": {$ne: "some condition"}}, 
            {$set: {"status": "value 2"}},
            {multi: true},
            function(err, numAffected) {
                // All done.
            }
        )
    }
)

答案 1 :(得分:1)

答案:

几乎可以在聚合管道中使用 $set 阶段

  1. 使用 $set 计算每条记录中的条件值
  2. 使用 $out 更新集合中的记录

示例:

db.collectionname.aggregate(
    [
        {
            $set: {                   //Compute the new value
                'ResultField': {
                    $cond: {
                        if: {
                            $lt: ['$ScoreField', 40]
                        },
                        then: "Fail",
                        else: "Pass"
                    }
                }
            }
        },
        {
            $out: 'collectionname'    //Update the records in collection
        }
    ]
)