2016-08-30 57 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.',你会得到更好的结果。 –