Mongoose - 查询深度嵌套的对象

Posted

技术标签:

【中文标题】Mongoose - 查询深度嵌套的对象【英文标题】:Mongoose - Query deeply nested Objects 【发布时间】:2019-09-18 21:21:29 【问题描述】:

我目前遇到一个问题,我必须更新深度嵌套文档中的条目。现在为了简化我的问题,我有这个例子。假设我将汽车存储在我的 MongoDB 中。文档看起来像这样


  Make: "BMW",
  Model: "3Series",
  Wheels: [
    
      _id: someObjectId
      Size: "19 inch",
      Screws: [
        
          _id: someObjectId
          Type : "M15x40"
        ,
        
          _id: someObjectId
          Type : "M15x40"
        
      ]
    
  ]

现在如果我想更新一个特定的 Wheel,我的代码看起来有点像这样

CarModel.findOneAndUpdate(
  "_id": CarId, "Wheels._id": WheelId
, 
  "$set" : 
    "Wheels.$.Size": NewSize
  
)

现在可以了。但是当我通过 2 个阵列时,我对如何更新一个特定的螺丝非常迷茫。有什么想法可以让我完成这项工作吗?

【问题讨论】:

【参考方案1】:

您需要arrayFilters 功能来定义多个嵌套数组的路径:

CarModel.findOneAndUpdate(
     "_id": CarId ,
     $set:  "Wheels.$[wheel].Screws.$[screw].Type": "something"  ,
     arrayFilters: [  'wheel._id': WheelId ,  'screw._id': screwId  ] )

【讨论】:

不错。对于已经工作的用例,这看起来也更干净。我马上试试。谢谢 ;) mongoose 文档是否可能在该主题上相当不完整,或者我只是找不到这个? 好的。我将不得不弄清楚如何将它与 TypeScript 一起使用,因为从外观上看,它们的类型中缺少它。会回到这个;) @relief.melone 不确定您是否可以在 mongoose 文档中找到它,它只是 MongoDB 语法和 mongoose,因为 ODM 会将其直接发送到数据库 嗯。我一直无法使用零件(Wheels Wheels.$[wheel].Screws... 来遍历元素。@types/mongoose 在其 QueryFindOneAndUpdateOptions 界面中不包含 arrayFilters 也很奇怪 好的。所以我将数据库更新到 V4.0 并在那里查看。它是一种魅力。因此,我再次将答案标记为已接受,并且适用于遇到相同问题的任何人。确保您至少拥有 MongoDB V3.6。再次感谢

以上是关于Mongoose - 查询深度嵌套的对象的主要内容,如果未能解决你的问题,请参考以下文章

Mongo - 通过_id更新嵌套的对象数组

MongoDB Mongoose 聚合查询深度嵌套数组删除空结果并填充引用

使用 mongoose 查询嵌套文档

Mongoose - 无法更新深度嵌套对象

如何从深度嵌套的文档中 $pull (mongoose)

填充嵌套数组的无引用对象