在Mongodb中,如何聚合以计算每组的不同项?
在管道中,以下分组在Mongodb中,如何聚合以计算每组的不同项?,mongodb,aggregation-framework,Mongodb,Aggregation Framework,在管道中,以下分组 { $group: { "_id": "$salesperson", "items": { $push: "$city" } } } 产生如下结果: { "_id":"Fred", "items": ["Boston", "Chicago", "Chicago", "Boston"] }, { "_id":"Mary", "items": ["Austi
{
$group: {
"_id": "$salesperson",
"items": {
$push: "$city"
}
}
}
产生如下结果:
{
"_id":"Fred",
"items": ["Boston", "Chicago", "Chicago", "Boston"]
},
{
"_id":"Mary",
"items": ["Austin", "Chicago", "Austin", "Louisville"]
}
我想为每个销售人员统计不同的城市,这样我就能得到:
[
{
"Fred":2
},
{
"Mary":3
}
]
如何修改管道以实现这一目标?
编辑:按照建议使用$addToSet
后,我得到如下管道:
[
{
"$match": {
"$and": [
{
"field1": {
"$in": ["a", "b", "c"]
}
},
{
"field2": {
"$in": ["d", "e"]
}
}
]
}
},
{
"$group": {
"_id": "$salesperson",
"items": {
"$addToSet": "$city"
}
}
}
]
如何计算每套、每组中的项目数?您正朝着正确的方向前进,只是需要使用$addToSet(将字段添加到数组中)而不是$push(将字段添加到数组中) 现在它将产生以下结果:
{
"_id":"Fred",
"items": ["Boston", "Chicago"]
},
{
"_id":"Mary",
"items": ["Austin", "Chicago", "Louisville"]
}
在下一个阶段中,您可以像现在一样计算数组中的元素
在这里,我添加了完整的查询:
db.collection.aggregate([
{
$group: {
"_id": "$salesperson",
"items": {
$addToSet: "$city"
}
}
},
{
$group:{
"_id":null,
"data":{
$push:{
"k":"$_id",
"v":{
$size:"$items"
}
}
}
}
},
{
$project:{
"data":{
$arrayToObject:"$data"
}
}
},
{
$replaceRoot:{
"newRoot":"$data"
}
}
]).pretty()
它将为您提供输出:
{ "Fred" : 2, "Mary" : 3 }
希望它能帮助你。更多信息请参考。您希望items数组有重复项并另外获得不同的值计数,还是在items数组中只有唯一的值(城市)可以?如何
$group:{{u id:$salesson,items:{$push:$city}
生成这样的输出[{“Fred”:[“Boston”,“Chicago”,“Chicago”,“Boston”],{“Mary”:奥斯汀、芝加哥、奥斯汀、路易斯维尔]}]
?请分享完整的信息。@srinivasy uniques才是最重要的。@JoshuaFox我已经更新了答案。看一看,谢谢$addToSet对值进行唯一性验证。但是您的$project子句包含数据值——我如何在管道中使用它?@JoshuaFox请共享您的完整查询和数据,以便我可以重构您的查询并得出解决方案。我添加了查询(管道)。实际的管道在$and中有更多的子句,但这正确地表示了$match和$group结构。谢谢!两个注释:(1)您的第一个代码块有$push,但我认为需要$addToSet;(2)为了清楚起见,您能否将第一个代码块合并到第三个(aggregate()调用)中,其中$group应该在第二个group之前的数组中。@JoshuaFox哈哈,似乎$addToSet在上次编辑中被替换了。我已经用完整的查询更新了答案。
{ "Fred" : 2, "Mary" : 3 }