将 MongoDB 聚合函数与 $in 或 $nin 结合使用
Combine MonogDB aggregate function with $in or $nin
我正在尝试使用 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 运算符相结合的最佳方式是什么?
谢谢
$group
步骤删除所有未明确说明的字段。这意味着到达 $match
阶段的文档只有字段 _id
和 count
。不再有可以匹配的字段 UserName
。如果您想按 UserName
过滤,您需要确保 UserName
也是 $group
生成的文档的一部分。
因为$group
将多个文档压缩成一个,你需要指定如果多个分组文档对UserName
有不同的值时如何处理。选项是 $last
/$first
以使用 last/first 聚合文档的值(警告:在 $group
之前没有明确的 $sort
,顺序是不可预测的), $addToSet
创建所有唯一值的数组或 $push
创建所有重复值的数组。
但是,您可能希望在 对文档进行分组之前 过滤掉不需要的文档,因此更好的解决方案可能是将 $match
移动到 $group
.
我正在尝试使用 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 运算符相结合的最佳方式是什么?
谢谢
$group
步骤删除所有未明确说明的字段。这意味着到达 $match
阶段的文档只有字段 _id
和 count
。不再有可以匹配的字段 UserName
。如果您想按 UserName
过滤,您需要确保 UserName
也是 $group
生成的文档的一部分。
因为$group
将多个文档压缩成一个,你需要指定如果多个分组文档对UserName
有不同的值时如何处理。选项是 $last
/$first
以使用 last/first 聚合文档的值(警告:在 $group
之前没有明确的 $sort
,顺序是不可预测的), $addToSet
创建所有唯一值的数组或 $push
创建所有重复值的数组。
但是,您可能希望在 对文档进行分组之前 过滤掉不需要的文档,因此更好的解决方案可能是将 $match
移动到 $group
.