集合中所有(特定)数组的元素的 mongodb 聚合总和

标签 mongodb aggregation-framework

也许有人可以帮我解决这个问题。

我有一个包含如下数据的集合:

{
    "id" : 123,
    "country" : "US",
    "timestamp" : 1417904130
}
{
    "id" : 123,
    "country" : "DE",
    "timestamp" : 1417904136
}
{
    "id" : 111,
    "country" : "US",
    "timestamp" : 1417904512
}
{
    "id" : 111,
    "country" : "US",
    "timestamp" : 1417904777
}
...

我试过这个:

db.countries_usg.aggregate( [ { $match: {}}, { $group: {'_id': "$id", 'countries': {'$addToSet': '$country'} }} ], {'allowDiskUse': true})

但这只会给我:

{ "_id" : 123, "languages" : [ "US", "DE" ] }
{ "_id" : 111, "languages" : [ "US" ] }
...

我需要这个:

{ "_id" : 123, "languages" : [ "US": 1, "DE": 1 ] }
{ "_id" : 111, "languages" : [ "US": 2 ] }
...

或类似的。有人知道如何解决这个问题吗?

非常感谢!

最佳答案

这可以使用两个连续的 $group 聚合来实现:

db.countries_usg.aggregate([
        { $group: {
            '_id': {id:"$id", "country" : "$country"},
            "count" : { "$sum": 1 }
        }},
        { $group: {
            '_id': "$_id.id",
            "countries" : {"$push" : {country:"$_id.country", count : "$count"}}
        }},
    ],
    {'allowDiskUse': true}
);

结果会是这样的:

{ "_id" : 123, "countries" : [ { "country" : "DE", "count" : 1 }, { "country" : "US", "count" : 1 } ] }
{ "_id" : 111, "countries" : [ { "country" : "US", "count" : 2 } ] }

关于集合中所有(特定)数组的元素的 mongodb 聚合总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28087239/

相关文章:

MongoDb 聚合 : Select all group by x

mongodb - 查看长时间运行的 mongodb 聚合作业的进度

javascript - MongoDB:如何获取主文档和所有祖先

mongodb - 查找和分组

arrays - MongoDB:$pull/$unset 有多个条件

javascript - 使用 mongoskin 对 mongodb 进行单个查询或多个查询???

php - 如何在 laravel 中聚合 mongodb 集合数据

node.js - 聚合和分配随机获胜者的更好方法

node.js - MongoDB 聚合查找和展开

c# - 无法在 MongoDB .NET 驱动程序中将 'MongoDB.Bson.BsonString' 类型的对象转换为 'MongoDB.Bson.BsonDocument' 类型