【发布时间】:2011-05-06 12:28:24
【问题描述】:
我在 mongodb 中有一个文档,其中包含需要更新的 2 级深度嵌套对象数组,如下所示:
{
id: 1,
items: [
{
id: 2,
blocks: [
{
id: 3
txt: 'hello'
}
]
}
]
}
如果只有一级深度数组,我可以使用位置运算符来更新其中的对象,但对于第二级,我想出的唯一选择是使用位置运算符和嵌套对象的索引,如下所示:
db.objects.update({'items.id': 2}, {'$set': {'items.$.blocks.0.txt': 'hi'}})
这种方法有效,但对我来说似乎很危险,因为我正在构建一个 Web 服务,并且索引号应该来自客户端,它可以发送 100000 作为索引,这将迫使 mongodb 创建一个包含 100000 个空值索引的数组。
是否有任何其他方法可以更新此类嵌套对象,我可以在其中引用对象的 ID 而不是它的位置,或者在查询中使用它之前检查提供的索引是否超出范围?
【问题讨论】:
-
我建议您重新访问此模式并找到不同的设计,以便您可以利用 MongoDB 提供的功能。将没有简单/超级有效的方法来更新数组 AFAIK 中的特定项目。你能否重新设计它,以便利用
addToSet、pop和其他数组运算符? -
感谢您的建议,是的,我可以,事实上我已经这样做了。问这个问题我只是想确定我没有遗漏任何东西。
-
我也面临同样的问题。那么你能发布你的示例重新设计的架构吗?