【问题标题】:Mongoose - How to push object in nested array of objectsMongoose - 如何在嵌套的对象数组中推送对象
【发布时间】:2022-01-20 17:41:22
【问题描述】:

我的 MongoDb 数据库中有这个数据结构:

    "menu": [
            {
                "dishCategory":"61e6089f209b802518e2b4a4",
                "dishMeals": [
                    {
                        "dishMealName": "Burger King",
                        "dishMealIngredients": "Burger lepinja, bbq sos, berlin sos, zelena"
                        "dishMealPrice": 5
                    }
                ]
            }
        ]

我如何在 dishMeals 中以确切的 dishCategory 推送新对象(我通过 req.body 提供dishCategory id、newDish 对象和餐厅的_id)我试过了这但没有任何改变:

     await Restaurants.updateOne(
            {
                '_id' : _id,
                'menu.dishCategory' : dishCategoryId
            },
            {
                $push : {
                    'menu.$.dishMeals' : newDish
                }
            }
        );

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:
    1. 使用arrayFilters 过滤数组字段中的嵌套文档,如果满足arrayFilters 中的过滤条件,则使用$push
    db.collection.update({
      "_id": _id,
      "menu.dishCategory": dishCategoryId
    },
    {
      $push: {
        "menu.$[menu].dishMeals": newDish
      }
    },
    {
      arrayFilters: [
        {
          "menu.dishCategory": dishCategoryId
        }
      ]
    })
    

    Sample Mongo Playground

    【讨论】:

    • 对不起,我犯了一个错误,我有 "dishCategory":"61e6089f209b802518e2b4a4" 而不是之前的对象。当我尝试这样的“menu.dishCategory”:dishCategoryId“它不工作
    • Demo 对我来说看起来不错。也许另一件要查找的事情是确保您传递具有确切类型的值,例如,如果 dishCategory 是 ObjectId,那么 dishCategoryId 的值也必须是 ObjectId 类型。
    【解决方案2】:

    您可以在update 查询中使用arrayFilters 配置:

    db.collection.update({
      "restaurant_id": 1
    },
    {
      "$push": {
        "menu.$[element].dishMeals": {
          "dishMealName": "Best Burger",
          "dishMealIngredients": "Best burger in town",
          "dishMealPrice": 10
        }
      }
    },
    {
      "arrayFilters": [
        {
          "element.dishCategory._id": "61e6089f209b802518e2b4a4"
        }
      ]
    })
    

    Working example

    【讨论】:

    • 谢谢您的方法运行良好,这是我的错误,没有检查 discCategory 是否确实是 ObjectId 而不是字符串
    【解决方案3】:

    您可以阅读他们提供的问题和解决方案here,希望这对您有所帮助。

    db.collection.update({
        "_id": 1,
        "menu.dishCategory": "61e6089f209b802518e2b4a4"
    },
    {
        $push: {
            "menu.$.dishMeals": newMeal
        }
    })
    

    【讨论】:

    • 谢谢您的方法运行良好,这是我的错误,没有检查 discCategory 是否确实是 ObjectId 而不是字符串
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 2020-07-08
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    相关资源
    最近更新 更多