如何在pymongo聚合中基于组字段值的最大值添加过滤器

时间:2019-03-01 20:10:53

标签: mongodb pymongo elasticsearch-aggregation

在我的MongoDB集合中,每个文档都有一个字段score和一个归档的query,因此我试图按query对文档进行分组,即获取具有相同文档组query提交了,同时,我只希望包含score = 3(score的范围是0、1、2、3)的文件的组。这是我的第一个聚合子句:

agg = [{
    "$group": {
        "_id": "$query",
        "src_ids": {"$push": "$src_id"},
        "sources": {"$push": "$source"},
        "scores": {"$push": "$score"}
    }
}]

所以我想我必须在$match的{​​{1}}中添加一个scores,但该怎么做?

==========================

修改

如果我们有6个文件:

agg

{"query": "bread", "score": 2, ...}

{"query": "bread", "score": 1, ...}

{"query": "meat", "score": 2, ...}

{"query": "meat", "score": 3, ...}

{"query": "fruit", "score": 0, ...}

因此,在这里,通过使用上面的聚合子句:{"query": "fruit", "score": 3, ...},我们有3组:db.collection.aggregate(agg)breadmeat。但是,如果考虑分数问题,则不应该退回面包。

2 个答案:

答案 0 :(得分:0)

因此添加的匹配条件将在scores数组中查找3。

agg = [
{
    "$group": {
        "_id": "$query",
        "src_ids": {"$push": "$src_id"},
        "sources": {"$push": "$source"},
        "scores": {"$push": "$score"}
    }
},
{
    "$match": {
        "scores": 3
    }
}
]

答案 1 :(得分:0)

受@Mani的启发,其实很简单,但是我对Mongodb还是陌生的。

agg = [{
    "$group": {
        "_id": "$query",
        "src_ids": {"$push": "$src_id"},
        "sources": {"$push": "$source"},
        "scores": {"$push": "$score"},
        "max_score": {"$max": "$score"}
    }},
    {
    "$match": {
        "max_score": {"$eq": 3}
    }}
]