MongoDB获取不同值的数量

5
假设我有一组记录:
{'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
使用聚合管道和 group 进行聚合。 - Ali Dehghani
1个回答

9

使用$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" }

不要忘记更改收集名称。


最后一个管道阶段也可以像这样:{ $project: { _id: 0, color: "$_id", count: 1} } - Ali Dehghani
是的,当然,它表示相同的结果。只是想要获得带有颜色数组的单个文档作为结果,就像问题中一样。这就是为什么我将它们分组的原因。 - mr.tarsa
为了重塑文档,最好使用 $project 运算符。如果您用该投影替换最后一个管道阶段,则可以获得更好的结果,而不需要 _idcolor_freq. - Ali Dehghani
1
是的,我同意,“$group”阶段除了重塑文档之外还有另一个目的,并且与“$project”一起使用仍将产生相同的结果,因此更新了答案。 - mr.tarsa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接