繁体   English   中英

MongoDB从集合中独立聚合两个字段并计数

[英]MongoDB Aggregate two fields from collection independently and count

我在 MongoDB 集合中有如下所示的数据:

{id: 11111, up: 450000, down: 452000}

我目前可以按以下字段之一进行分组并通过执行以下操作进行计数(我正在使用 PyMongo):

    {
        "$group": {
            "_id": {"up": "$up",},
            "count": {"$sum": 1}
        }
    },
    {"$project": {"_id": 0, "label": "$_id.up", "count": "$count"}},


    {"$sort": {"label": 1}},
    {"$match": {"count": {"$gt": 0}}},

这给了我以下结果:

{
   {
      "count": 35,
      "label": 450000
   }
}

我试图让“向上”和“向下”字段以以下格式显示:

{
   {
      "count": 35,
      "label": 450000
   },
   {
      "count": 35,
      "label": 452000
   }
}

希望有人可以帮助我执行此查询。 我可以管理的最接近的是将“上”和“下”放在“标签”下的数组中,但我希望它们彼此独立。

谢谢!

我们可以用$objectToArray$project向上和向下拆分为一个对象数组,然后$unwind以获取向上和向下的单独文档,然后继续与上述相同以按标签计数:

db.collection.aggregate([
    {
        "$project": {
            "updown": {
                "$objectToArray": {
                    "up": "$up",
                    "down": "$down"
                }
            }
        }
    },
    {"$unwind": "$updown"},
    {
        "$group": {
            "_id": {
                "label": "$updown.v"
            },
            "count": {"$sum": 1}
        }
    },
    {"$project": {"_id": 0, "label": "$_id.label", "count": "$count"}},
    {"$sort": {"label": 1}},
    {"$match": {"count": {"$gt": 0}}}
])

结果:

[
    {"count": 4, "label": 450000},
    {"count": 2, "label": 452000},
    {"count": 2, "label": 462000}
]

mongoplayground

示例数据设置:

from pymongo import MongoClient

client = MongoClient()
db = client.test

# Remove Collection if exists
db.collection.drop()
# Insert Sample Data
db.collection.insert_many([{'id': 11111, 'up': 450000, 'down': 452000},
                           {'id': 11112, 'up': 450000, 'down': 462000},
                           {'id': 11113, 'up': 450000, 'down': 452000},
                           {'id': 11114, 'up': 450000, 'down': 462000}])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM