2016-11-30 123 views
2

我一直在尋找答案,但無法找到任何地方。查詢返回扁平嵌入字段

當我在robomongo中使用以下方法檢索匹配條件的文檔的嵌入字段時,我得到一個列表中的所有匹配文檔。 所有這些文檔都包含一系列帶有我選擇的嵌入字段的文檔。

db.getCollection('test').find(
    { "bom.COMPONENT": "101-00001-017" }, 
    { _id: 0, "CicodeList.Cicode": 1 } 
) 

結果

/* 1 */ 
{ 
    "CicodeList" : [ 
     { 
      "Cicode" : "one" 
     } 
    ] 
} 

/* 2 */ 
{ 
    "CicodeList" : [ 
     { 
      "Cicode" : "two" 
     } 
    ] 
} 

/* 3 */ 
{ 
    "CicodeList" : [ 
     { 
      "Cicode" : "three" 
     } 
    ] 
} 

我想得到的是一個包含所有文件的所有嵌入式領域,像這樣一個數組:

{ results: ["one", "two", "three"] } 

原始憑證看起來有點像這樣

/* 1 */ 
{ 
    "_id" : ObjectId("583df12093181938d03c50eb"), 
    "CicodeList" : [ 
     { 
      "Cicode" : "one" 
     }, 
     { 
      "Cicode" : "two" 
     } 
    ], 
    "bom" : [ 
     { 
      "COMPONENT" : "101-00001-017" 
     }, 
     { 
      "COMPONENT" : "101-00008-002" 
     } 
    ] 
} 

/* 2 */ 
{ 
    "_id" : ObjectId("583df12193181938d03c50ec"), 
    "CicodeList" : [ 
     { 
      "Cicode" : "three" 
     }, 
     { 
      "Cicode" : "four" 
     } 
    ], 
    "bom" : [ 
     { 
      "COMPONENT" : "101-00001-017" 
     }, 
     { 
      "COMPONENT" : "101-00008-002" 
     } 
    ] 
} 
+0

看起來你必須使用聚合框架,該框架。或者只是讓你的應用程序代碼照顧它。 –

+0

@wallage謝謝你的文檔,我已經更新了我的回答 –

+0

[如何從mongoDB集合中獲取數組?](http://stackoverflow.com/questions/38210121/how-to-get-array-from- mongodb-collection) – styvane

回答

0

我建議使用aggregation框架

db.test.aggregate([ 
    { 
     $match : { "bom.COMPONENT": "101-00001-017" } 
    }, 
    { 
     $unwind: { 
      path: "$CicodeList" 
     } 
    }, 
    { 
     $group: { 
      "_id": null, 
      "results": { $push: "$CicodeList.Cicode" } 
     } 
    } 
]) 

它會打印出所有的 「bom.COMPONENT」 存在的Cicode的值等於 「101-00001-017」

{"results" : [ "one", "two", "three", "four" ]} 
+0

聚合比「Chridam」提供的獨特方法有優勢嗎? – wallage

0

以下查詢您只需要在嵌入式字段上運行distinct方法如下

db.getCollection('test').distinct("CicodeList.Cicode", 
    { "bom.COMPONENT": "101-00001-017" } /* query */ 
) 

結果

/* 1 */ 
[ 
    "one", 
    "two", 
    "three" 
] 
+0

感謝您的支持。它似乎完美地工作。 「Oleksandr」提供的聚合方法有什麼區別 – wallage

+0

不同之處在於它是一個完全不同的命令,它返回一個不同值的數組。雖然聚合框架提供了相同的結果,但'$ unwind'的過程可能會降低性能,因爲它會「爲每個數組條目生成每個文檔的副本」,從而使用更多的內存(聚合流水線上的可能內存上限佔總內存的10% ),因此也需要「時間」產生以及「時間」來處理。 – chridam