我是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 } }
)
型
我试着用这个,但是它替换了整个集合对象,而不是单个对象。
2条答案
按热度按时间egdjgwm81#
要在Mongoose中修改或更新数组内的对象,可以使用
Model.updateMany()
方法沿着$set
运算符和$positional
运算符。例如,如果有一个名为BlogPost的模型,其中名为comments的字段包含一个对象数组,则可以使用以下代码更新数组中的特定对象:在上面的代码中,$set运算符用于更新comments数组中具有匹配
_id
字段的对象的name字段,$position运算符用于指定要更新comments数组中的哪个元素。或者,可以使用
Model.findOneAndUpdate()
方法更新包含对象数组的单个文档。例如:在这种情况下,
findOneAndUpdate()
方法将查找第一个与查询匹配的文档,然后更新comments数组中的指定对象。如果您只想更新单个文档,而不是像updateMany()
方法那样更新多个文档,则此方法非常有用。sqyvllje2#
您可以按如下方式使用arrayFilters:
Playground