更新数组中的数组中的项

Fré*_*gan 7 mongodb

我在mongodb集合中有一个文档,如下所示:

{
    sessions : [
        {
            issues : [ 
                {
                    id : "6e184c73-2926-46e9-a6fd-357b55986a28",
                    text : "some text"
                },   
                {
                    id : "588f4547-3169-4c39-ab94-8c77a02a1774",
                    text : "other text"
                }
            ]
        } 
    ]
} 
Run Code Online (Sandbox Code Playgroud)

我想在第一个会话中使用id 588f4547-3169-4c39-ab94-8c77a02a1774更新问题.

问题是我只知道它是第一个会话和问题ID(不是问题的索引!)

所以我尝试这样的事情:

db.mycollection.update({ "sessions.0.issues.id" : "588f4547-3169-4c39-ab94-8c77a02a1774"}, 
                       { $set: { "sessions.0.issues.$.text" : "a new text" }})
Run Code Online (Sandbox Code Playgroud)

但是我得到了以下结果:

WriteResult({
    "nMatched" : 0,
    "nUpserted" : 0,
    "nModified" : 0,
    "writeError" : {
        "code" : 16837,
        "errmsg" : "The positional operator did not find the match needed from the query. Unexpanded update: sessions.0.issues.$.text"
    }
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点 ?

感谢帮助.

dgi*_*ugg 10

你必须使用这个(显然是等效的)查询:

db.mycollection.update({"sessions.0.issues": {$elemMatch: {id: <yourValue>}}}, {$set: {"sessions.0.issues.$.text": "newText"}})
Run Code Online (Sandbox Code Playgroud)

请注意您的更新表达式是正确的.

有关的更多信息$elemMatch.

顺便说一句,MongoDB引用表明$运算符不能"使用遍历嵌套数组的查询".

重要提示:$elemMatch仅适用于版本4或更高版本.