2016-11-30 124 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