我正在尝试创建一个系统来跟踪我的应用上的拆分测试。 每个用户都被分配一个int值,代表他们的状态,然后我存储每次访问,访问时都会引用用户文档。
下面的查询假设给我一个test_subject字段为0的用户每天的平均在线数。
这是我目前的示意图:
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")
这是我当前的查询:
def aa(request):
year = datetime.datetime.now().year
month = datetime.datetime.now().month
result = Visits._get_collection().aggregate([
{
"$unwind": "$visits"
},
{
"$match": {"visits.user.test_subject" : 0}
},
{"$group": {
"_id": {
"day": "$day"
},
"visits": {
"$avg": "$visits.time_spent"
}
}}
])
return result
由于某种原因,输出始终为空数组。
修改
访问集合:
{ "_id" : { "$oid" : "5397661f88dba01cd8156eea" },
"year" : 2014,
"month" : 6,
"day" : 10,
"visits" : [ { "$oid" : "5397660b88dba01cd8156ee9" }, { "$oid" : "539766b988dba01cd8156eeb" }, { "$oid" : "5397670088dba01cd8156eec" } ] }
访问收藏:
{ "_id" : { "$oid" : "5397660b88dba01cd8156ee9" }, "user" : 2, "time_spent" : 0 }
{ "_id" : { "$oid" : "539766b988dba01cd8156eeb" }, "user" : 2, "time_spent" : 0 }
{ "_id" : { "$oid" : "5397670088dba01cd8156eec" }, "user" : 3, "time_spent" : 0 }
用户收藏:
{ "_id" : 2, "created_at" : { "$date" : "2014-06-10T21:59:37.417+0100" }, "test_subject" : 0 }
{ "_id" : 3, "created_at" : { "$date" : "2014-06-10T21:59:37.417+0100" }, "test_subject" : 0 }
答案 0 :(得分:1)
MongoDB没有连接,您无法汇总来自3个独立集合的数据。
您的问题是,当您可能尝试将文档嵌入到一个集合中时,您可以创建单独的集合
您的Post
和Visit
及User
类应继承自EmbeddedDocument
而不是Document
。这样,您的Visits集合将具有嵌入的文档,然后您可以在该集合上运行聚合。