MongoDB 独特的聚合

我正在做一个查询,查找每个州拥有最多拉链的城市:

db.zips.distinct("state", db.zips.aggregate([
{ $group:
{ _id: {
state: "$state",
city: "$city"
},
numberOfzipcodes: {
$sum: 1
}
}
},
{ $sort: {
numberOfzipcodes: -1
}
}
])
)

查询的聚合部分似乎工作得很好,但是当我添加不同的部分时,得到的结果是空的。

这是因为我在 id 中有状态吗? 我可以执行类似 distinct("_id.state的操作吗?

177473 次浏览

独立的和聚合的框架是不可互操作的。

相反,你只想:

db.zips.aggregate([
{$group:{_id:{city:'$city', state:'$state'}, numberOfzipcodes:{$sum:1}}},
{$sort:{numberOfzipcodes:-1}},
{$group:{_id:'$_id.state', city:{$first:'$_id.city'},
numberOfzipcode:{$first:'$numberOfzipcodes'}}}
]);

可以使用 $addToSet和聚合框架来计算不同的对象。

例如:

db.collectionName.aggregate([{
$group: {_id: null, uniqueValues: {$addToSet: "$fieldName"}}
}])

或者扩展为将您的唯一值放入正确的列表中,而不是放入 null _ id 记录中的子文档中:

db.collectionName.aggregate([
{ $group: {_id: null, myFieldName: {$addToSet: "$myFieldName"}}},
{ $unwind: "$myFieldName" },
{ $project: { _id: 0 }},
])

SQL 查询: (按不同分组和计数)

select city,count(distinct(emailId)) from TransactionDetails group by city;

等效的 mongo 查询如下所示:

db.TransactionDetails.aggregate([
{$group:{_id:{"CITY" : "$cityName"},uniqueCount: {$addToSet: "$emailId"}}},
{$project:{"CITY":1,uniqueCustomerCount:{$size:"$uniqueCount"}} }
]);

您可以在单个数组上调用 $setUnion,它还可以过滤欺骗:

{ $project: {Package: 1, deps: {'$setUnion': '$deps.Package'}}}