猫鼬:使用$ pull删除嵌入式文档数组中的值(MongoDB 3.4版本)

时间:2019-03-04 13:11:23

标签: node.js mongodb mongoose

我正在尝试使用节点js中的猫鼬从嵌套数组中删除值。 我的架构结构是这样的:

    ([{_id: 1,


    results: [
      { item: "A", score: 5, answers: [ { q: 1, a: 4 }, { q: 2, a: 6 } ] },
      { item: "B", score: 8, answers: [ { q: 1, a: 8 }, { q: 2, a: 9 } ] }
   ]
},
{
   _id: 2,
   results: [
      { item: "C", score: 8, answers: [ { q: 1, a: 8 }, { q: 2, a: 7 } ] },
      { item: "B", score: 4, answers: [ { q: 1, a: 0 }, { q: 2, a: 8 } ] }
   ]
}])

我想从a为8的答案中删除值。 我的查询是

db.collection.update({"results.item":{$in:["C","B"]}},{$pull:{"results.$.answers":{a:8}}})

此查询工作正常,但仅更新一个文档。请帮忙。

我想要的输出是

([{
   _id: 1,
   results: [
      { item: "A", score: 5, answers: [ { q: 1, a: 4 }, { q: 2, a: 6 } ] },
      { item: "B", score: 8, answers: [ { q: 2, a: 9 } ] }
   ]
},
{
   _id: 2,
   results: [
      { item: "C", score: 8, answers: [ { q: 2, a: 7 } ] },
      { item: "B", score: 4, answers: [ { q: 1, a: 0 } ] }
   ]
}])

谢谢。

2 个答案:

答案 0 :(得分:1)

单个语句需要MongoDB 3.6或更高版本的filtered positional $[<identifier>]支持:

db.collection.updateMany(
  { "results.item": { "$in": ["C","B"] } },
  { "$pull": { "results.$[el].answers": { "a": 8 } } },
  { "arrayFilters":  [{ "el.item": { "$in": ["C", "B"] } }] }
)

结果:

{
        "_id" : 1,
        "results" : [
                {
                        "item" : "A",
                        "score" : 5,
                        "answers" : [
                                {
                                        "q" : 1,
                                        "a" : 4
                                },
                                {
                                        "q" : 2,
                                        "a" : 6
                                }
                        ]
                },
                {
                        "item" : "B",
                        "score" : 8,
                        "answers" : [
                                {
                                        "q" : 2,
                                        "a" : 9
                                }
                        ]
                }
        ]
}
{
        "_id" : 2,
        "results" : [
                {
                        "item" : "C",
                        "score" : 8,
                        "answers" : [
                                {
                                        "q" : 2,
                                        "a" : 7
                                }
                        ]
                },
                {
                        "item" : "B",
                        "score" : 4,
                        "answers" : [
                                {
                                        "q" : 1,
                                        "a" : 0
                                }
                        ]
                }
        ]
}

答案 1 :(得分:0)

  

默认情况下, update()方法更新单个文档。设置   多参数更新所有符合查询条件的文档。

设置{multi: true}或使用updateMany

参考:https://docs.mongodb.com/manual/reference/method/db.collection.update/