2015-10-24 45 views
0

我有这个以下strtucture拉值 - >数组 - >对象 - >对象蒙戈

{ 
    _id: ".....", 
    a: { 
    a1:".......", 
    b: [ 
     b1: { 
     b11: "......", 
     b12: "......", 
     }, 
     b2: { 
     b21: "......", 
     b22: "......", 
     d: {}, 
     }, 
     c:{ 
     c1: { 
      ...... 
     }, 
     d: { 

     } 
     } 
    ] 
    } 
} 

在这里我要检查,如果财产d存在与否里面b,它可以在多个对象内部存在b,如果存在,则从记录中提取d对象。

注意:有可能是一个机会,财产d存在多次内部b1b2,在这种情况下,我想从所有对象

我试着像

Coll.find({ 'a.b': { $elemMatch: { 'c': { d: { $exists: true } } } } }) 

删除,但它没有返回任何东西,虽然有记录,任何帮助表示赞赏。

我想从记录中提取数据。

谢谢。

UPDATE

Coll.find({ 'a.b.c.d'{ $exists: true } }) 

是为我工作,但仍然不知道如何使用位置操作员从记录拉值

回答

0

请花一点时间,形成你的问题到让他们更容易回答:您的示例数据在列表中包含键值(无效),您的问题提到了$ elemMatch这是一个列表操作符,您讨论的是删除事物但从未跟踪过这个想法,然后您的UPDATE swi这意味着它是一个对象层次结构。

从您的更新以一个提示,我创建了一些有效的数据 - 粘贴到蒙戈外壳(也许在测试数据库):

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" 
     } 
     } 
    } 
    } 
}) 

里面蒙戈外壳,一切都是JavaScript的如此“位置运营商“是点和数组下标操作符。 mongo find()返回文档数组。如果你想从查询

db.test.find({'a.b.c.d': {$exists: true}})[0].a.b.c.d 

返回从第一个文档中的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(); 
+0

感谢您的回答,这里'B'是对象的数组,我的记录结构是正确的,我觉得。来到你的答案我想从记录中删除'object d'而不是获取数据,我可以读取数据,但是从记录中提取数据我找不到确切的查询 – Sasikanth

+0

在数组上:尝试将您的示例插入到收集 - 查看错误。删除时:使用$ unset删除单个字段。更新我的答案以显示如何。 –