mongodb Mongoose修改/更新数组中的对象

kr98yfug  于 2022-12-18  发布在  Go
关注(0)|答案(2)|浏览(344)

我是MongoDB的新手,我正在使用mongoose作为我的模式。我想从模式中更新/修改嵌套数组,但我需要帮助来弄清楚如何进行。
下面是我的模式:

const workoutSchema = new Schema(
  {
    dayName: {
      type: String,
      required: true
    },
    exercises: [
      {
        name: {
          type: String,
          required: true
        },
        sets: [
          {
            reps: {
              type: Number,
              required: true
            },
            weight: {
              type: Number,
              required: true
            }
          }
        ]
      }
    ]
  },
  { timestamps: true }
)

以下是示例数据:

[
    {
        "_id": "6394d7b173d4d862b1124ced",
        "dayName": "Push Day",
        "exercises": [
            {
                "name": "Lat Pulldown",
                "sets": [
                    {
                        "weight": 40,
                        "_id": "6394d7db73d4d862b1124cf6"
                    },
                    {
                        "weight": 45,
                        "_id": "6394d7db73d4d862b1124cf7"
                    },
                    {
                        "weight": 45,
                        "_id": "6394d7db73d4d862b1124cf8"
                    }
                ],
                "_id": "6394d7db73d4d862b1124cf5"
            },
            {
                "name": "Deadlift",
                "sets": [
                    {
                        "reps": 5,
                        "weight": 65,
                        "_id": "6396e712ddd2681f1618922a"
                    },
                    {
                        "reps": 4,
                        "weight": 65,
                        "_id": "6396e712ddd2681f1618922b"
                    },
                    {
                        "reps": 4,
                        "weight": 65,
                        "_id": "6396e712ddd2681f1618922c"
                    }
                ],
                "_id": "6396e712ddd2681f16189229"
            }
        ],
        "createdAt": "2022-12-10T19:02:09.771Z",
        "updatedAt": "2022-12-12T08:32:17.996Z",
        "__v": 0
    }
]

exercies数组可以有多个练习。我想要的是首先选择日期(在本例中为Push Day,然后添加选择特定练习(在本例中假设为Lat Pulldown)并更新练习数组中的特定集合。我无法理解这一点。有人能给我指出正确的方向吗?谢谢阅读。

await WorkoutModel.findOneAndUpdate(
    { "exercises.sets._id": setId },
    { $set: { "exercises.$.sets": req.body } }
  )


我试着用这个,但是它替换了整个集合对象,而不是单个对象。

egdjgwm8

egdjgwm81#

要在Mongoose中修改或更新数组内的对象,可以使用Model.updateMany()方法沿着$set运算符和$positional运算符。例如,如果有一个名为BlogPost的模型,其中名为comments的字段包含一个对象数组,则可以使用以下代码更新数组中的特定对象:

BlogPost.updateMany(
    { "comments._id": <id of the object to update> },
    { $set: { "comments.$.name": "New name" } }
)

在上面的代码中,$set运算符用于更新comments数组中具有匹配_id字段的对象的name字段,$position运算符用于指定要更新comments数组中的哪个元素。
或者,可以使用Model.findOneAndUpdate()方法更新包含对象数组的单个文档。例如:

BlogPost.findOneAndUpdate(
    { "comments._id": <id of the object to update> },
    { $set: { "comments.$.name": "New name" } }
)

在这种情况下,findOneAndUpdate()方法将查找第一个与查询匹配的文档,然后更新comments数组中的指定对象。如果您只想更新单个文档,而不是像updateMany()方法那样更新多个文档,则此方法非常有用。

sqyvllje

sqyvllje2#

您可以按如下方式使用arrayFilters:

db.collection.update({
"dayName": "Push Day",
"exercises.sets._id": "6394d7db73d4d862b1124cf6"
},
{
$set: {
 "exercises.$[y].sets.$[x]": {
  test: 1
  }
}
},
{
  arrayFilters: [
{
  "x._id": "6394d7db73d4d862b1124cf6"
 },
{
  "y.name": "Lat Pulldown"
 }
]
})

Playground

相关问题