MongoDB:updateOne查询,设置未设置值(如果存在)

时间:2017-03-31 14:14:02

标签: node.js mongodb database

我希望创建一个mongodb查询来更新一次文档,这样就可以设置一些带有值的字段,如果已有字段可用(其他字段未设置)则取消设置。

我是这样做的:

db.collection('collectionName").find({"itemId": itemsDataArray[i].itemId }).updateOne(
                { "$unset" :
                    {
                        "field1": 1,
                        "field2": 1,
                        "field3": 1
                    }
                },
                { "$set": 
                    { 
                       "field4" : "value",
                       "field5" : "value"

                    }
                })

现在问题是如果文档中没有field1,2或3,那么查询无法设置字段4和5.

我在mongo查询中是否缺少任何标志? 请帮忙。

编辑:解决方案

db.collection('collectionName').find({"itemId": itemsDataArray[i].itemId }).updateOne(
                { "$unset" :
                    {
                        "field1": 1,
                        "field2": 1,
                        "field3": 1
                    }, 
                  "$set": 
                    { 
                       "field4" : "value",
                       "field5" : "value"

                    }
                })

2 个答案:

答案 0 :(得分:2)

我认为你的大括号错了。

您正在使用.collection(...).find(...).updateOne({"$unset" :{} }, {"$set": {} })

您应该使用.collection(...).find(...).updateOne({"$unset" :{}, "$set": {} })

请注意,您错过了filter的{​​{1}}参数。你看过findOneAndUpdate吗?

最后,它可能是一个复制/粘贴错误,但是在集合访问(updateOne)中引号不匹配。

答案 1 :(得分:1)

请阅读updateOne的文档。

第一个参数是过滤器。你想要达到的目标应该是:

db.d.updateOne(
    {"itemId": itemsDataArray[i].itemId},
    { 
        "$unset":
            {
                "field1": 1,
                "field2": 1,
                "field3": 1
            },

        "$set": 
        { 
           "field4" : "value",
           "field5" : "value"

        }
    }
)