Уникальная агрегация MongoDB
Я работаю над запросом, чтобы найти города с наибольшим количеством почтовых индексов для каждого штата:
db.zips.distinct("state", db.zips.aggregate([ {$group:{_id:{state:"$state", city:"$city"},numberOfzipcodes:{$sum:1}}}, {$sort:{numberOfzipcodes:-1}}]))
Агрегированная часть запроса, кажется, работает нормально, но когда я добавляю отличительные, я получаю пустой результат.
Это потому что у меня есть штат в id? Могу ли я сделать что-то похожее distinct("_id.state
?"
Ответы
Ответ 1
Отличие и структура агрегации не являются взаимоисключаемыми.
Вместо этого вы просто хотите:
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'}}}
]);
Ответ 2
Вы можете использовать $addToSet с помощью структуры агрегации для подсчета различных объектов.
Например:
db.collectionName.aggregate([{
$group: {_id: null, uniqueValues: {$addToSet: "$fieldName"}}
}])
Ответ 3
SQL Query: (по группам и количеству отдельных)
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"}} }
]);