2015-10-24 47 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刪除單個字段。更新我的答案以顯示如何。 –