62

我正在查询每个州的拉链最多的城市:

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

查询的聚合部分似乎工作正常,但是当我添加 distinct 时,我得到一个空结果。

这是因为我在 id 中有状态吗?我可以做类似的事情distinct("_id.state吗?

4

4 回答 4

127

您可以将$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 }},
])
于 2016-02-03T20:31:24.887 回答
58

Distinct 和聚合框架不可互操作。

相反,您只想:

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'}}}
]);
于 2013-05-03T22:59:02.440 回答
28

SQL 查询:(group by & count of distinct)

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"}} } 
]);
于 2017-02-22T09:49:50.553 回答
3

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

{ $project: {Package: 1, deps: {'$setUnion': '$deps.Package'}}}
于 2019-11-27T13:54:44.097 回答