找不到 ID 并更新和递增子文档 - returns null Mongoose/mongoDB

Cannot find id and update and increment sub-document - returns null Mongoose/mongoDB

我遇到一个问题,我似乎无法检索数组中嵌套对象的 _id。特别是我的对象数组的食物部分。我想找到 _id,让我们说意大利调味饭,然后动态增加订单计数(来自同一个对象)。

我正在尝试动态完成此操作,因为我在 req.body._id 中尝试了 Risotto id,这很好,但我无法继续并尝试增加订单,因为我得到 null。

出于某种原因,我一直得到 null,我认为它是一个嵌套文档,但我不确定。这也是我的路由文件和架构。

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
}

菜单名称的 id 在它的位置有效,但我不需要它,因为我需要访问食物子文档。提前致谢。

您正在向 MenuSchema.findByIdAndUpdate 更新查询发送食物 ID (5e3b75f2a3d43821a0fb57f0)。它应该是 5e3b75f2a3d43821a0fb57ee

的菜单 ID

您可以通过它的 id 找到菜单,并使用 mongodb $ positional operator.

使用食物 _id 或食物名称更新它是其中一种食物

通过提供菜单 ID 和食物 ID 进行更新:

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

通过提供菜单 ID 和食物名称进行更新:

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