2016-08-30 56 views
0

的數量可以說我有記錄的集合:MongoDB中獲得不同的值

{'name':'record1', 'colors':['red','green','blue']} 
{'name':'record2', 'colors':['red','orange']} 
{'name':'record3', 'colors':['red','yellow','blue']} 
{'name':'record4', 'colors':['red','green','blue']} 

我可以用得到的不同顏色的列表:

collection.distinct('colors') 
#returns 
['red','green','blue','orange','yellow'] 

是有可能得到的計數這些值發生的記錄?

例如:

[{'count':4,'color':'red'},{'count':2,'color':'green'}] 
+1

使用具有「組」的聚合流水線 –

回答

1

使用$group階段這樣一個聚合管道:

db.collectionName.aggregate( 
    { $unwind: "$colors" }, 
    { $group: { "_id": "$colors", "count": { $sum: 1 } } }, 
    { $project: { "color": "$_id", "count": 1 } } 
); 

爲您的文件將導致到

{ "count" : 1, "color" : "yellow" } 
{ "count" : 1, "color" : "orange" } 
{ "count" : 3, "color" : "blue" } 
{ "count" : 2, "color" : "green" } 
{ "count" : 4, "color" : "red" } 

不要忘了改集合名稱。

+0

最後一個流水線階段也可以像'{$ project:{_id:0,color:「$ _id」,count:1}} –

+0

當然,它代表了相同的結果。簡單地想要用一系列顏色來實現單個文檔,就像在問題中一樣。這就是我將它們分組的原因。 – tarashypka

+0

對於重塑文檔,最好使用'$ project'操作符。如果用這個投影替換你的最後一個流水線階段,沒有'_id'和'color_freq.',你會得到更好的結果。 –