2013-04-22 64 views
22

比方说,我有以下的文件中收集:MongoDB:如何获取不同的子文档字段值列表?

{ 
    "family": "Smith", 
    "children": [ 
     { 
      "child_name": "John" 
     }, 
     { 
      "child_name": "Anna" 
     }, 
    ] 
} 

{ 
    "family": "Williams", 
    "children": [ 
     { 
      "child_name": "Anna" 
     }, 
     { 
      "child_name": "Kevin" 
     }, 
    ] 
} 

现在我希望得到某种方式的唯一孩子的名字下面的列表跨越所有的家庭:

[ "John", "Anna", "Kevin" ] 

结果的结构可能会有所不同。如何在MongoDB中实现?应该是简单的东西,但我不明白。我在集合上尝试了aggregate()函数,但后来我不知道如何应用distinct()函数。

+0

http://docs.mongodb.org/manual/core/map-reduce/ – 2013-04-22 19:37:22

回答

46

你可以这样做:

db.collection.distinct("children.child_name"); 

在你的情况下,退货:

[ "John", "Anna", "Kevin" ] 
+2

该死的,好容易!我伤了脑袋。谢谢这是最短的工作答案,给我正是我想要的。 – vladimir 2013-04-22 20:11:14

+2

好的 - 但在分片群集上的性能呢?例如,将在每个rs实例上处理不同的显式数据;) – 2013-04-22 20:13:14

+1

很明显,我不是在考虑性能的问题。但这是很重要的,谢谢。 – vladimir 2013-04-22 20:16:34

5

的帮助下聚合框架:

db.collection.aggregate([{$unwind:'$children'}, {$group:{_id:'$children.child_name'}}]) 

或更多的利息),其具有名字的频率:

db.collection.aggregate([{$unwind:'$children'}, {$group:{_id:'$children.child_name', freq:{$sum:1}}}]) 
+0

但这不是他要求的 - 他希望不同的名称数组不是子文档,每个名称和它的数量... – 2013-04-22 19:57:04

+0

我读过它: >“结果的结构可能不同。” 是的!,这是一个不同的结构;) – 2013-04-22 20:00:50

+0

是的,谢谢。它的工作原理,并迫使我了解骨料() – vladimir 2013-04-22 20:12:05

相关问题