将MonogDB聚合函数与$ in或$ nin组合使用

时间:2015-12-09 13:03:35

标签: mongodb mongodb-query pymongo

我尝试使用MongoDB查询来查询数据,该查询将$ match与$ nin运算符组合在一起:

coll = mdb.get_collection_by_name('Client')
query = [
    {"$group": {"_id": {"Domain": "$Domain"}, "count":{"$sum":1}}},
    {"$match": { "UserName": { "$nin": excluded_users}}},
    {"$sort": { "count": -1 } }
]

res = list(coll.aggregate(query))
print(res)

看起来,MongoDB忽略了我的$ match行并计算了包含excluded users的记录。我试图搜索类似的示例,但没有找到将$ match与$ in或$ nin组合的查询。这支持了吗? 难道我做错了什么?将聚合查询与$ nin或$ in运算符组合在一起的最佳方法是什么? 感谢

1 个答案:

答案 0 :(得分:0)

$group步骤将删除未明确说明的所有字段。这意味着到达$match阶段的文档只包含字段_idcount。您无法再匹配任何字段UserName。如果您想按UserName进行过滤,则需要确保UserName也是$group生成的文档的一部分。

由于$group将多个文档压缩为一个,因此如果多个分组文档具有UserName的不同值,则需要指定如何处理。选项为$last / $first以使用上一个/第一个聚合文档的值(警告:在$sort之前没有明确的$group,订单是不可预测的),{{ 1}}创建一个包含所有唯一值的数组或$addToSet以创建包含重复项的所有值的数组。

但是,您可能希望在分组之前使用不需要的文档过滤文档,因此更好的解决方案可能是在$push之前移动$match