猫鼬:查找父对象并更新嵌套对象

时间:2020-07-06 07:32:16

标签: javascript node.js mongodb mongoose

问题

我有以下对象:

[
   {
      "_id":"1",
      "store":"llama.com",
      "items":[
         {
            "_id":"1_1",
            "name":"item1"
         },
         {
            "_id":"1_2",
            "name":"item2"
         }
      ]
   },
   {
      "_id":"2",
      "store":"frog.com",
      "items":[
         {
            "_id":"2_1",
            "name":"item1"
         },
         {
            "_id":"2_2",
            "name":"item2"
         }
      ]
   }
]

在这个对象中,我需要:

  1. 找到商店;
  2. 通过item查找_id
  3. 更新商品名称

尝试过的解决方案

我尝试使用aggregate,但是我只能找到该对象,而不能修改它:

const ObjectId = mongoose.Types.ObjectId;
const item = await UserModel.aggregate([
  { $unwind: "$items" },
  {
    $match: { store, "items._id": ObjectId("1_1") },
  },
]);

所需结果

如何通过store查找项目,然后通过_id查找项目子项,最后更改找到的item的名称?

提前谢谢!

2 个答案:

答案 0 :(得分:1)

storeitems._id中,输入要搜索的变量。 $set在这里更改名称。

这适用于1级嵌套数组。对于更深层的嵌套数组,应使用arrayFilters https://docs.mongodb.com/manual/release-notes/3.6/#arrayfilters

const item = await UserModel.findOneAndUpdate(
  {
    store: "some store",
    "items._id": "your id"
  },
  {
    $set: {
      [`items.$.` + variable]: "change your name"
    }
  }
);

答案 1 :(得分:1)

看看是否可行

   const item = await UserModel.findOneAndUpdate({ "store": "storeName", 
                "items._id" : "id" },{$set:{"items.0.name":"itemName"}}, {new: true})