推送数组中的元素,它是特定位置的另一个对象的关键

时间:2016-01-07 21:31:42

标签: node.js mongodb mongoose mongodb-query

我有一个像这样的猫鼬模型:

"question": {
    "_id": "1234",
    "title": "Hi",
    "content": "Hello",
    "viewed": 34425,
    "answers": [{
        "vote": 0,
        "date": "2015-12-21T13:03:14.334Z",
        "author": "john",
        "content": "hello",
        "comments": []
    }, {
        "vote": 0,
        "date": "2015-12-21T13:05:27.411Z",
        "author": "patrick",
        "content": "bonjour",
        "comments": []
    }]
}

我想将评论推送到question.answers[1].comment,但我无法通过findOneAndUpdate进行评论。
以下是我的尝试:

MySchema.findOneAndUpdate({_id: questionId}, 
    {$push: 
        {'answers.$.comments': {
              '$each': [comment], 
              '$position': 1}
        }
    }, function(err, doc) {...

但我收到此错误:MongoError: exception: The positional operator did not find the match needed from the query. Unexpanded update: answers.$.comments

1 个答案:

答案 0 :(得分:1)

问题是,要使用位置$更新运算符,数组字段必须作为查询文档的一部分出现。

MySchema.findOneAndUpdate(
    { "_id": questionId, "question.answers.author": "patrick" }, 
    { "$push": { "question.answers.$.comments": { "$each": [comment] } } }, 
    function(err, doc) {
        //Do something
    }
)

documentation中所述:

  

如果您知道嵌入文档的数组索引,则可以使用dot notation使用嵌入文档的位置指定文档。

MySchema.findOneAndUpdate(
    { "_id": questionId }, 
    { "$push": { "question.answers.1.comments": { "$each": [comment] } } }, 
    function(err, doc) {
        //Do something
    }
)