首页 > 解决方案 > 使用嵌入文档列表中的烧瓶 mongoengine 按日期查询

问题描述

我有这个带有flask-mongoengine 的文档:

class AverageByDate(EmbeddedDocument):
    id = ObjectIdField(default=lambda: ObjectId())
    date = DateField(default=datetime.date.today(), required=True)
    average = FloatField(required=True)
    count = IntField(required=True)

class TopicEvaluationAverageMetric(Document):
    topic_id = IntField(primary_key=True, required=True)
    average_by_date = ListField(EmbeddedDocumentField(AverageByDate), required=True)

我想获取所有 TopicEvaluationAverageMetric 并按日期过滤,如下所示:

 average_by_date = list(filter(lambda x: x.date > a_week_ago.date(),
                               sum([i.average_by_date for i in TopicEvaluationAverageMetric.objects()], [])))

上面的代码可以工作,但是加载 TopicEvaluationAverageMetric.objects() 的所有数据库并不好

我想在 TopicEvaluationAverageMetric 上的 average_by_date 列表中查询。我尝试了 __match 或 mongoengine 的聚合,但它们中的任何一个都对我有用。

参考:https ://github.com/MongoEngine/mongoengine/issues/1442 如何在 mongoengine 中仅包含选定的嵌入文档?

我怎样才能使这个过滤器更好?我的目标是有关此模型的返回指标。

[编辑]

我正在尝试这样的事情:

    pipeline = [
    {
        "$match": {"$and": [{"average_by_date.date": {"$gt": a_week_ago}}]}
    },
    {
        "$addFields": {
            "average_by_date": {
                "$filter": {
                    "input": "$average_by_date",
                    "as": "average_by_date",
                    "cond": {"$and": [{"$gt": ["$average_by_date.date", a_week_ago]}]}
                }
            }
        }
    }
]
x = list(TopicEvaluationAverageMetric.objects.aggregate(*pipeline))

标签: mongodbmongodb-queryaggregation-frameworkmongoengineflask-mongoengine

解决方案


推荐阅读