簡體   English   中英

如何使用多嵌套數組文檔 findOneAndUpdate 單個字段

[英]How to findOneAndUpdate single field with multi nested array documents

我被困在如何使用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)
 }
);

我該如何解決這個問題?

為了滿足@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"
    }]
})

可以使用過濾的位置運算符$[<identifier>]來完成,這在嵌套數組更新的用例中非常有用。

查詢(Mongo Shell):

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

使用 Mongoose Model 查詢:

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);
  }
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM