我有下面这个结构
{
_id: ".....",
a: {
a1:".......",
b: [
b1: {
b11: "......",
b12: "......",
},
b2: {
b21: "......",
b22: "......",
d: {},
},
c:{
c1: {
......
},
d: {
}
}
]
}
}
这里我想检查属性d
是否存在于b
中,它可能存在于b
中的多个对象中,如果存在则从记录中拉出d
对象。
注意:在b1
和b2
中可能有一个属性d
存在多次的机会,在这种情况下,我想从所有对象中删除它
I tried like
Coll.find({ 'a.b': { $elemMatch: { 'c': { d: { $exists: true } } } } })
但是没有返回任何东西,虽然有记录,感谢任何帮助。
我也想从记录中提取数据。
谢谢。
Coll.find({ 'a.b.c.d'{ $exists: true } })
为我工作,但仍然不知道如何使用位置运算符从记录
请多花一点时间形成你的问题使它们更容易回答:你的示例数据在列表(无效)内具有键值,你的问题提到$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"
}
UPDATE:在回应评论时添加细节。
如果要删除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();