MongoDB每个月每天获得平均访问量

时间:2014-06-08 17:40:24

标签: python mongodb aggregation-framework

我需要创建一个查询来检索每天的平均访问次数,按年和月分组。 我是mongoDB的新手,我真的不知道如何做到这一点。

这是我的数据库模型(代码在python中):

class Visits(Document):
    year = IntField(default=datetime.datetime.now().year)
    month = IntField(default=datetime.datetime.now().month)
    day = IntField(default=datetime.datetime.now().day, unique_with=('month', 'year'))
    visits = ListField(EmbeddedDocumentField('Visit'))


class Posts(Document):
    year = IntField(default=datetime.datetime.now().year)
    month = IntField(default=datetime.datetime.now().month)
    day = IntField(default=datetime.datetime.now().day, unique_with=('month', 'year'))
    posts = ListField(EmbeddedDocumentField('Post'))


class Visit(Document):
    user = ReferenceField('User')
    time_spent = IntField(default=0)


class Post(Document):
    id = IntField(primary_key=True)
    user = ReferenceField('User')
    number_of_comments = IntField(default=0)
    number_of_clicks = IntField(default=0)


class User(Document):
    id = IntField(primary_key=True)
    created_at = DateTimeField(default=datetime.datetime.now())
    test_subject = IntField(default="0")

1 个答案:

答案 0 :(得分:0)

您可以使用类上的._get_collection()方法获取pymongo驱动程序实现的原始“collection”对象。

因此,如果您有MongoDB 2.6或更高版本,则可以使用$size运算符进行聚合:

result = Visits._get_collection().aggregate([
    { "$group": {
        "_id": {
            "year": "$year",
            "month": "$month"
        },
        "visits": {
            "$sum": { "$size": "$visits" }
        }
    }}  
])

在MongoDB 2.6之前,您需要先$unwind数组才能获得元素数。

result = Visits._get_collection().aggregate([
    { "$unwind": "$visits" },
    { "$group": {
        "_id": {
            "year": "$year",
            "month": "$month"
        },
        "visits": { "$sum": 1 }
    }}
])

使用$match运算符限制范围可能是个好主意。 PyMongo和MongoDB样式查询与django样式有点不同,因此您可能希望使用MongoDB手册中的standard query operators来熟悉自己。