Как найти одно поле с одним вложенным массивом документов с несколькими вложенными массивами - PullRequest
1 голос
/ 30 октября 2019

Я застрял, как обновить одно значение в документах с несколькими вложенными массивами, указав findOneAndUpdate.

Мое состояние выглядит так:

Обновить складсумма, где productCode - «abc123», размер «41» на складе «Гамбург».

Я только что вернул ноль или бот размером 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 ]

1 голос
/ 30 октября 2019

И чтобы выполнить @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"
    }]
})
0 голосов
/ 30 октября 2019

Может быть выполнено с использованием отфильтрованного позиционного оператора $[<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);
  }
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...