MongoDB 聚合按引用文档匹配

1 投票
1 回答
535 浏览
提问于 2025-04-18 09:20

我正在尝试创建一个系统,用来跟踪我应用中的分割测试。每个用户会被分配一个整数值,代表他们的状态。然后我会记录每次访问,每次访问都与用户的文档有关联。

下面这个查询本来是想给我返回那些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 个回答

1

MongoDB没有连接功能,你不能从三个不同的集合中汇总数据。

你的问题在于,你创建了多个独立的集合,而你可能应该把这些文档放在一个集合里。

你的 PostVisitUser 类应该继承自 EmbeddedDocument,而不是 Document。这样一来,你的 Visits 集合就会包含嵌入的文档,你就可以在这个集合上进行汇总操作。

撰写回答