是否有一种方法可以更新数组内部的对象,而该数组也在另一个数组内部,就像本例中那样?
这就是集合的样子:
{
"_id": "5fd3966d2769d212dc0104a4",
"Races": [
{
"_id": "5fd3966d2769dc12dc0105f4",
"gpName": "Sakhir Grand Prix",
"RaceResult": [
{
"_id": "5fd3966d2769dc12dc0105e0",
"position": "First",
"driverName": "Hamilton"
},
{
"_id": "5fd3966d2769dc12dc0105e1",
"position": "Second",
"driverName": "Vettel"
}
]
},
{
"_id": "5fd3966d2769dc12dc0105df",
"gpName": "Abu Dhabi Grand Prix",
"RaceResult": [
{
"_id": "5fd39452d2769dc12dc0105df",
"position": "First",
"driverName": "Bottas"
},
{
"_id": "5fd3966d2769dc12dc0105e2",
"position": "Second",
"driverName": "Hamilton"
}
]
}
]
}
因此,例如,如果我想更改“美国大奖赛”而不是“萨基尔大奖赛”,我会选择:
StandingsModel.updateOne({ "Races._id": "5fd3966d2769dc12dc0105f4"}, {
"$set": {
"Races.$.gpName": 'United States Grand Prix'}
})
但是如何更改 RaceResults 中的“driverName”或“position”值?
我尝试过设置:
(为了澄清,在这个例子中我想更改阿布扎比大奖赛内的第二个车手名称)
StandingsModel.updateOne({ "Races.RaceResults._id": "5fd3966d2769dc12dc0105e2"}, {
"$set": {
"Races.$.RaceResults.$.driverName": 'Vettel'}
})
但是这当然不会按预期工作, Mongoose 会发回错误代码 2。
有什么想法吗?
谢谢。
最佳答案
您可以使用 $[<identifier>]
。还有一个名为 Update Nested Arrays in Conjunction with $[] 的特定部分.
您可以使用这种方式来过滤数组以查找您的 Race
id 首先是你的 RaceResult
之后id。
您可以使用此查询:
db.collection.update(
{ "_id": "5fd3966d2769d212dc0104a4" },
{ "$set": { "Races.$[race].RaceResult.$[result].driverName": "Vettel" } },
{ "arrayFilters": [
{ "race._id": "5fd3966d2769dc12dc0105df" },
{ "result.position": "Second" } ]
})
$set
stage 会将对象修改为 Race
与过滤器匹配的数组 race
。在竞赛数组内,将按 result
进行过滤过滤。
也就是说:查询将通过其 id
获得一场比赛使用过滤器race._id
并且在比赛中只有 position
的对象是 Second
将会更新。
因此查询将更新您想要的对象。您可以查看示例 here
关于mongodb - Mongoose,更新另一个数组内的数组内的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65255881/