我有以下结构
{
_id: ".....",
a: {
a1:".......",
b: [
b1: {
b11: "......",
b12: "......",
},
b2: {
b21: "......",
b22: "......",
d: {},
},
c:{
c1: {
......
},
d: {
}
}
]
}
}
这里我想检查d
内是否存在属性b
,它可能存在于b
内的多个对象中,如果存在则从记录中提取d
对象
注意:d
和b1
内可能多次存在属性b2
,在这种情况下,我想将其全部删除对象
我试过
Coll.find({ 'a.b': { $elemMatch: { 'c': { d: { $exists: true } } } } })
但它没有返回任何东西,虽然有记录,任何帮助赞赏。
我也希望从记录中提取数据。
感谢。
更新
Coll.find({ 'a.b.c.d'{ $exists: true } })
这对我有用,但仍然不知道如何使用位置运算符从记录中提取值
答案 0 :(得分:0)
请花一点时间来形成您的问题 ,以便更轻松地回答:您的示例数据在列表中包含键值(无效),你的问题提到$ elemMatch这是一个列表操作符,你谈论删除的东西,但从来没有跟进那个想法,然后你的UPDATE切换齿轮并暗示它是一个对象层次结构。
从你的UPDATE中提示,我创建了一些有效数据 - 将其粘贴到mongo shell中(可能在测试数据库中):
db.test.insert({
a: {
a1: "a1",
b: {
b1: {
b11: "b11",
b12: "b12",
},
b2: {
b21: "b21",
b22: "b22",
d: {},
},
c: {
c1: {
c1: "......"
},
d: {
d1: "woo hoo, struck gold"
}
}
}
}
})
在mongo shell中,一切都是javascript所以“位置运算符”是点和数组下标运算符。 mongo find()返回一个文档数组。如果您想要从查询返回的第一个文档中的d文档(对象)
db.test.find({'a.b.c.d': {$exists: true}})[0].a.b.c.d
产生
{
"d1": "woo hoo, struck gold"
}
更新:添加详细信息以回应评论。
如果要删除a.b.c.d子文档,请使用$unset
// remove sub-document a.b.c.d
db.test.update({}, {$unset: {'a.b.c.d': ''}});
// look at the document to verify that a.b.c.d is removed
db.test.find();