mongodb - Mongoose,更新另一个数组内的数组内的对象

标签 mongodb mongoose mongoose-schema

是否有一种方法可以更新数组内部的对象,而该数组也在另一个数组内部,就像本例中那样?

这就是集合的样子:

{
  "_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/

相关文章:

node.js - 如何在 Mongoose 中构建多对多关系?

mongodb - mongodb中的嵌套结构

Node.js、Express、Mongoose、MongoHQ(保存数据)

在 Mongoose 中将属性定义为 ObjectId 时出现 typescript 错误

regex - 如何在使用 morphia 的查询中使用正则表达式?

MongoDB:多个 $elemMatch

angularjs - 如何使用mongoose原生的 promise (mpromise)删除一个文档然后更新另一个文档

node.js - Mongoose Model.find 是不是一个函数?

javascript - 无法使用 mongoose 在express中的对象数组上调用map函数

javascript - 更新后生成的文档大于 16777216