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 - 查询深度嵌套的对象的主要内容,如果未能解决你的问题,请参考以下文章