2013-04-22 79 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

相關問題