PyMongo按多个键分组

2024-04-28 05:16:52 发布

您现在位置:Python中文网/ 问答频道 /正文

使用PyMongo,按一个键分组似乎可以:

results = collection.group(key={"scan_status":0}, condition={'date': {'$gte': startdate}}, initial={"count": 0}, reduce=reducer)

结果:

^{pr2}$

但是当我尝试按多个键分组时,我得到了一个异常:

results = collection.group(key={"scan_status":0,"date":0}, condition={'date': {'$gte': startdate}}, initial={"count": 0}, reduce=reducer)

如何正确地按多个字段分组?在


Tags: keyreducedatescanstatuscountgroupcondition
1条回答
网友
1楼 · 发布于 2024-04-28 05:16:52

如果您试图对两个键进行计数,那么尽管可以使用.group(),但最好的选择是通过^{}。在

它使用“本机代码运算符”,而不是.group()所需的JavaScript解释代码来执行与您试图实现的相同的基本“分组”操作。在

尤其是^{}管道操作员:

result = collection.aggregate([
    # Matchn the documents possible
    { "$match": { "date": { "$gte": startdate } } },

    # Group the documents and "count" via $sum on the values
    { "$group": {
        "_id": {
            "scan_status": "$scan_status",
            "date": "$date"
        },
        "count": { "$sum": 1 }
    }}
])

事实上,你可能想要把“日期”缩短为一个不同的时间段的东西。如:

^{pr2}$

使用Date Aggregation Operators,如下所示。在

或者用基本的“约会数学”:

import datetime
from datetime import date

result = collection.aggregate([
    # Matchn the documents possible
    { "$match": { "date": { "$gte": startdate } } },

    # Group the documents and "count" via $sum on the values
    # use "epoch" "1970-01-01" as a base to convert to integer
    { "$group": {
        "_id": {
            "scan_status": "$scan_status",
            "date": {
                "$subtract": [
                    { "$subtract": [ "$date", date.fromtimestamp(0) ] },
                    { "$mod": [
                        { "$subtract": [ "$date", date.fromtimestamp(0) ] },
                        1000 * 60 * 60 * 24
                    ]}
                ]
            }
        },
        "count": { "$sum": 1 }
    }}
])

它将从“epoch”时间返回整数值,而不是compisite value对象。在

但是所有这些选项都比.group()更好,因为它们使用本机编码的例程,并且执行它们的操作比您需要提供的JavaScript代码快得多。在

相关问题 更多 >