我需要创建一个查询来检索每天的平均访问次数,按年和月分组。 我是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")
答案 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来熟悉自己。