【问题标题】:MongoDB - Update a field in an object of an array with multiple filter conditionsMongoDB - 使用多个过滤条件更新数组对象中的字段
【发布时间】:2020-01-18 13:53:18
【问题描述】:

如果我的数据库中有以下文档:

{
    "_id" : MainId,
    "subdoc" : [
        {
            "_id" : SubdocId,
            "userid" : "someid",
            "toupdate": false,
        },
        {
            "_id" : SubdocId2,
            "userid" : "someid2",
            "toupdate": false,
        }       
    ],
    "extra" : [
        "extraid1",
        "extraid2"
    ]
}

如何更新 ID (SubdocId2) 必须匹配且 SubdocId2 的用户 ID 为“someid2”或值“extraid1”存在于“extra”中的子文档 SubdocId2?

我得到的最远的是:

db.coll.update({
"subdoc._id":"SubdocId2", {
    $or: ["extra":{$in:["extraid1"]}, "subdoc.userid":"someid2"]
    }
}, {"subdoc.$.toupdate":true})

也许我忘了引用一些东西,但我收到了一个错误(SyntaxError: invalid property id)

【问题讨论】:

  • SubdocId2 是字符串吗?
  • 技术上它是一个 ObjectId。
  • 好的,所以在您的更新中您需要使用 ObjectId。 “subdoc._id”:ObjectId('SubdocId2')。您正在使用字符串

标签: mongodb mongodb-query


【解决方案1】:

请试试这个:

db.coll.update(
    {
        $and: [{ "subdoc._id": SubdocId2 }, {
            $or: [{ "extra": { $in: ["extraid1"] } },
            { "subdoc.userid": "someid2" }]
        }] // subdoc._id && (extra || subdoc.userid)
    }, { $set: { "subdoc.$.toupdate": true } })

在您的查询中有几个语法问题,而且如果您在更新部分不使用$set - 它会用"subdoc.$.toupdate": true 替换整个文档。当然,如果您使用mongoose,这是不同的场景,因为猫鼬会在内部添加$set,但是在shell 或任何客户端中执行时,您需要指定$set。此外,如果SubdocId2ObjectId(),则需要在查询数据库之前将代码中的string 转换为ObjectId()

【讨论】:

  • 效果很好!谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-12-26
  • 2019-09-23
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多