如何使用多个嵌套数组文档查找OneAndUpdate单字段

时间:2019-10-30 18:36:42

标签: javascript mongodb mongoose

我坚持如何使用findOneAndUpdate更新多嵌套数组文档值中的单个值。

我的情况如下:

在仓库“汉堡”中更新productCode为“ abc123”,大小为“ 41”的仓库数量。

我只得到了null或漫游器大小41和42。

以下是文档的一部分:

{
 "_id": ObjectId("xxxx636309f84479ec0c7b"),
 "productCode": "abc123",
 "brand": "Nike",
 "name": "aaa",
 "model": "Runner",
 "color": "Brown",
 "image": "shoe.jpg",
 "sizes": [{
   "_id": ObjectId("xxxxc636309f84479ec0c7e"),
   "size": "41",
   "wares": [{
     "_id": ObjectId("xxxx2c636309f84479ec0c80"),
     "ware": "Hamburg",
     "amount": 7
    },
    {
     "_id": ObjectId("5db72c636309f84479ec0c7f"),
     "ware": "Berlin",
     "amount": 7
    }
   ]
  },
  {
   "_id": ObjectId("5db72c636309f84479ec0c7c"),
   "size": "42",
   "wares": [{
    "_id": ObjectId("5db72c636309f84479ec0c7d"),
    "ware": "Hamburg",
    "amount": 16
   }]
  }
 ],
 "__v": 0
}

这是我尝试过的:

Product.findOneAndUpdate({
  "productCode": "abc123",
  "sizes.size": 41,
  "sizes.wares.ware": "Hamburg"
 }, {
  "$set": {
   "sizes.0.wares.amount": 99
  }
 }, {
  useFindAndModify: false
 },
 (err, products) => {
  if (err) {
   return res.status(422).send(err)
  }
  return res.json(products)
 }
);

我该如何解决?

2 个答案:

答案 0 :(得分:1)

要实现@ambianBeing,这就是使用findOneAndUpdate的方式:

Product.findOneAndUpdate({
    "productCode": "abc123",
    "sizes": {
        $elemMatch: {
            $and: [
                { size: "41" },
                {
                    wares: {
                        $elemMatch: {
                            ware: "Hamburg"
                        }
                    }
                }]
        }
    }
}, {
    $set: {
        "sizes.$[theSize].wares.$[theWare].amount": 99
    }
}, {
    arrayFilters: [{
        "theSize.size": "41"
    }, {
        "theWare.ware": "Hamburg"
    }]
})

答案 1 :(得分:0)

可以使用过滤后的位置运算符$[<identifier>]来完成,在嵌套数组更新的用例中,这很不错。

查询(Mongo Shell):

db.collection.update(
  { productCode: "abc123" },
  { $set: { "sizes.$[outer].wares.$[inner].amount": 99 } },
  {
    arrayFilters: [{ "outer.size": "41" }, { "inner.ware": "Hamburg" }],
    multi: false
  }
);

使用猫鼬模型进行查询:

Product.update(
  { productCode: "abc123" },
  { "sizes.$[outer].wares.$[inner].amount": 99 },
  {
    arrayFilters: [{ "outer.size": "41" }, { "inner.ware": "Hamburg" }],
    multi: false
  },
  (err, rawDoc) => {
    if (err) {
      console.error(err);
    }
    console.info(rawDoc);
  }
);