我尝试使用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运算符组合在一起的最佳方法是什么?
感谢
答案 0 :(得分:0)
$group
步骤将删除未明确说明的所有字段。这意味着到达$match
阶段的文档只包含字段_id
和count
。您无法再匹配任何字段UserName
。如果您想按UserName
进行过滤,则需要确保UserName
也是$group
生成的文档的一部分。
由于$group
将多个文档压缩为一个,因此如果多个分组文档具有UserName
的不同值,则需要指定如何处理。选项为$last
/ $first
以使用上一个/第一个聚合文档的值(警告:在$sort
之前没有明确的$group
,订单是不可预测的),{{ 1}}创建一个包含所有唯一值的数组或$addToSet
以创建包含重复项的所有值的数组。
但是,您可能希望在分组之前使用不需要的文档过滤文档,因此更好的解决方案可能是在$push
之前移动$match
。