【问题标题】:MongoDB query a document by it's nested array of objects and update all objects inside document's array that matchs queryMongoDB 通过它的嵌套对象数组查询文档并更新文档数组中匹配查询的所有对象
【发布时间】:2018-03-29 10:25:45
【问题描述】:

所以我在一个集合中有以下文档。

{
       _id: "1",
       quantity: 0,
       array: [{name: "test1a", quantity: 10}, {name: "test1a", quantity: 1}, {name: "test1b", quantity: 10}, {name: "test1c", quantity: 1}]
}

{
       _id: "2",
       quantity: 0,
       array: [{name: "test2a", quantity: 10}, {name: "test2b", quantity: 10}, {name: "test2c", quantity: 1}]
}

{
       _id: "3",
       quantity: 0,
       array: [{name: "test3a", quantity: 10}, {name: "test3b", quantity: 10}, {name: "test3c", quantity: 1}]
}

我想要的是查询集合中的所有文档,其数组包含名称为“test1a”的对象,并使用新值更新这些对象数量属性。

【问题讨论】:

  • 更新什么?
  • @Krishna 使用 $set 运算符具有新的 int 值。

标签: arrays mongodb


【解决方案1】:

试试类似的东西

db.collection.find({"array.name": "test1a"}).forEach(function(doc){       
var myArray = doc.array;
for (var i in myArray){
    if(myArray[i].name == "test1a"){
        myArray[i].quantity = myArray[i].quantity +1;        
    }
}
 db.collection.update({"_id": doc._id},{$set: {"array":myArray}});
});

【讨论】:

  • 收到如下错误:无法使用部分(array.quantity的数组)遍历元素。
  • 问题是,array.&.quantity 只更新数组中的第一个元素。我想要的是更新与 name = "test1a" 匹配的所有数组元素。
【解决方案2】:

db.test.updateMany(
    { "array.name": "test1a" }, 
    { "$set": { "array.$[elem].quantity": "newvalue" } },
    { "arrayFilters": [{ "elem.name": "test1a" }] }
)

【讨论】:

  • 问题是,array.&.quantity 只更新数组中的第一个元素。我想要的是更新与 name = "test1a" 匹配的所有数组元素。
  • 我得到以下错误=不能使用部分(array of array.$[elem].quantity)来遍历元素。
  • 你使用了arrayfilters选项吗?
  • 是的,我确实使用了 arrayFilters 选项。
  • 我测试了查询,然后在这里发布。你能发布你的完整查询吗
猜你喜欢
  • 2018-08-08
  • 2017-02-20
  • 1970-01-01
  • 2019-10-09
  • 2019-02-20
  • 1970-01-01
  • 2020-03-28
  • 2021-11-12
  • 1970-01-01
相关资源
最近更新 更多