Не удается найти идентификатор, обновить и увеличить вложенный документ - возвращает ноль Mongoose / mongoDB - PullRequest
1 голос
/ 08 февраля 2020

У меня проблема с тем, что я не могу получить _id моих вложенных объектов в моем массиве. В частности, это часть моего массива объектов. Я хочу найти _id, скажем, ризотто, а затем динамически увеличивать количество заказов (из этого же объекта).

Я пытаюсь сделать это динамически, поскольку я попробовал идентификатор Risotto в req.body._id, и это нормально, но я не могу go пересылать и пытаться увеличивать ордера, когда получаю ноль .

По какой-то причине я получаю нулевое значение, и я думаю, что это вложенный документ, но я не уверен. Вот мой файл маршрута и схема тоже.

router.patch("/update", [auth], async (req, res) => {


const orderPlus = await MenuSchema.findByIdAndUpdate({ _id: '5e3b75f2a3d43821a0fb57f0' }, { $inc: {  "food.0.orders": 1 }}, {new: true} );
//want to increment orders dynamically once id is found
//not sure how as its in its own seperate index in an array object

  try {
    res.status(200).send(orderPlus);
  } catch (err) {
    res.status(500).send(err);
  }
});

Схема:

const FoodSchema = new Schema({
  foodname: String,
  orders: Number,
});

const MenuSchema = new Schema({
  menuname: String,
  menu_register: Number,
  foods: [FoodSchema]
});

Вот возвращенная база данных JSON

{
    "_id": "5e3b75f2a3d43821a0fb57ee",
    "menuname": "main course",
    "menu_register": 49,
    "foods": [
        {
            "_id": "5e3b75f2a3d43821a0fb57f0",
            "foodname": "Risotto",
            "orders": 37
        },
        {
            "_id": "5e3b75f2a3d43821a0fb57ef",
            "foodname": "Tiramisu",
            "orders": 11
        }
    ],
    "__v": 0
}

идентификатор для меню работает на его месте, но мне это не нужно, так как мне нужен доступ к продуктам subdocs. заранее спасибо.

1 Ответ

1 голос
/ 08 февраля 2020

Вы отправляете идентификатор еды (5e3b75f2a3d43821a0fb57f0) в запрос на обновление MenuSchema.findByIdAndUpdate. Это должен быть идентификатор меню, который 5e3b75f2a3d43821a0fb57ee

. Вы можете найти меню по его идентификатору и обновить один из продуктов, используя food _id или foodname, используя позиционный оператор mongodb $ .

Обновление с указанием идентификатора меню и идентификатора еды:

router.patch("/update", [auth], async (req, res) => {
  try {
    const orderPlus = await MenuSchema.findByIdAndUpdate(
      "5e3b75f2a3d43821a0fb57ee",
      { $inc: { "foods.$[inner].orders": 1 } },
      { arrayFilters: [{ "inner._id": "5e3b75f2a3d43821a0fb57f0" }], new: true }
    );

    res.status(200).send(orderPlus);
  } catch (err) {
    res.status(500).send(err);
  }
});

Обновление с указанием идентификатора меню и названия продовольствия:

router.patch("/update", [auth], async (req, res) => {
  try {
    const orderPlus = await MenuSchema.findByIdAndUpdate(
      "5e3b75f2a3d43821a0fb57ee",
      { $inc: { "foods.$[inner].orders": 1 } },
      { arrayFilters: [{ "inner.foodname": "Risotto" }], new: true }
    );

    res.status(200).send(orderPlus);
  } catch (err) {
    res.status(500).send(err);
  }
});
...