在 Mongodb 中使用$pull删除深度嵌入的对象
Using $pull in Mongodb to remove a deeply embedded object
我正在尝试从嵌入的数组中删除($pull
)对象。(使用 javascript/node.js 驱动程序。
下面是示例数据,其中 1、2、3 是级别:
{
one : "All",
one : [
{
name: "People",
two: [
{
three_id: 123,
three: "Jonny",
},
{
three_id: 456,
three: "Bobby",
}
]
},
{
name: "Animals",
two: [
{
three_id: 828,
three: "Cat",
},
{
three_id: 282,
three: "Dog",
}
]
}
]
}
在这个例子中,我试图摆脱"鲍比"。
如果需要,我可以在"三级"上成功匹配文档,如下所示:
db.test.find({"one.two.three_id" : 456});
但是,我不知道如何使用update
消除该记录。以下是一些尝试,这些尝试都不起作用:
// failed attempts
db.test.update({"one.two.three_id" : 456}, {$pull:{'one.$.two.$.three_id': 456}});
db.test.update({"one.two.three_id" : 456}, {$pull:{'three_id': 456}});
// deletes entire level two "People"
db.test.update({"one.two.three_id" : 456}, {$pull: {one: {two : {$elemMatch: {'three_id': 456}}}}});
我读到你不能使用两个位置$ operators
,你必须知道第二个位置的索引位置。但是,我想避免使用要删除的嵌入式词典的索引。
参考:蒙戈德拉
http://docs.mongodb.org/manual/reference/operator/update/pull/
$pull
对象中的键值必须是目标数组的路径。 这似乎有效:
db.test.update(
{'one.two.three_id': 456},
{$pull: {'one.$.two': {three_id: 456}}}
);
在这种情况下,看起来$
表示第一个匹配数组级别的索引,因此即使我们在多个嵌套级别之间进行匹配,它也可以正常工作。
相关文章:
- 在不知道深度或父属性的情况下从对象中删除属性
- 如何对映射插件创建的敲除对象进行深度复制
- 将对象从另一个不可变的Map分配给Map是否意味着深度克隆
- Chai深度包含了对嵌套对象的断言
- javascript对象值的动态深度访问
- 与 lodash 进行对象深度比较的数组
- 深度嵌套的backbone.js对象会导致错误
- Javascript 深度对象相等时,对象通过 json 字符串与生成器创建
- 编码为深度嵌套对象的 HTML 字段 json
- 如何过滤对象内部深度堆叠的数据(并在之后编辑删除它)
- 从knockout.js中的另一个对象更新一个深度结构化的javascript对象
- javascript中嵌套对象的深度复制数组
- AngularJS:深度对象修改后视图不更新
- ngModel的深度对象创建机制
- 在JavaScript中构建到深度对象树的路径
- 深度对象在nodejs中存在控制吗?
- Chai中仅自身对象属性的深度对象等式
- 在javascript中生成深度对象中所有属性链的数组
- Javascript:解析时深度对象中的访问函数
- Angular.js深度对象解析