MongoDB聚合按参考文档匹配

时间:2014-06-10 19:04:09

标签: python django mongodb

我正在尝试创建一个系统来跟踪我的应用上的拆分测试。 每个用户都被分配一个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 }

1 个答案:

答案 0 :(得分:1)

MongoDB没有连接,您无法汇总来自3个独立集合的数据。

您的问题是,当您可能尝试将文档嵌入到一个集合中时,您可以创建单独的集合

您的PostVisitUser类应继承自EmbeddedDocument而不是Document。这样,您的Visits集合将具有嵌入的文档,然后您可以在该集合上运行聚合。