如何根据pymongo聚合中组字段值的最大值添加过滤器
How to add filter based on the maximum of group field value in pymongo aggregations
在我的 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"}
}
}]
所以我想,我必须在 agg
中添加一个关于 scores
中的最大值的 $match
,但是我应该怎么做呢?
=============================
编辑
如果我们有 6 个文件:
{"query": "bread", "score": 2, ...}
{"query": "bread", "score": 1, ...}
{"query": "meat", "score": 2, ...}
{"query": "meat", "score": 3, ...}
{"query": "fruit", "score": 0, ...}
{"query": "fruit", "score": 3, ...}
所以这里通过使用上面的聚合子句:db.collection.aggregate(agg)
,我们有 3 组:bread
、meat
、fruit
。但是,如果考虑到分数问题,面包应该是不退的。
因此添加的匹配条件将在 scores 数组中查找 3。
agg = [
{
"$group": {
"_id": "$query",
"src_ids": {"$push": "$src_id"},
"sources": {"$push": "$source"},
"scores": {"$push": "$score"}
}
},
{
"$match": {
"scores": 3
}
}
]
受到@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}
}}
]
在我的 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"}
}
}]
所以我想,我必须在 agg
中添加一个关于 scores
中的最大值的 $match
,但是我应该怎么做呢?
=============================
编辑
如果我们有 6 个文件:
{"query": "bread", "score": 2, ...}
{"query": "bread", "score": 1, ...}
{"query": "meat", "score": 2, ...}
{"query": "meat", "score": 3, ...}
{"query": "fruit", "score": 0, ...}
{"query": "fruit", "score": 3, ...}
所以这里通过使用上面的聚合子句:db.collection.aggregate(agg)
,我们有 3 组:bread
、meat
、fruit
。但是,如果考虑到分数问题,面包应该是不退的。
因此添加的匹配条件将在 scores 数组中查找 3。
agg = [
{
"$group": {
"_id": "$query",
"src_ids": {"$push": "$src_id"},
"sources": {"$push": "$source"},
"scores": {"$push": "$score"}
}
},
{
"$match": {
"scores": 3
}
}
]
受到@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}
}}
]