【问题标题】:Combine MonogDB aggregate function with $in or $nin将 MongoDB 聚合函数与 $in 或 $nin 组合
【发布时间】:2016-03-14 18:27:16
【问题描述】:

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

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" 之后,文档将只有 _id 和 count 字段,但您希望在 UserName 字段上匹配。您可能需要在 $group 之前移动 $match

标签: mongodb mongodb-query pymongo


【解决方案1】:

$group 步骤会删除所有未明确说明的字段。这意味着到达$match 阶段的文档只有_idcount 字段。没有您可以匹配的字段UserName。如果要按UserName 过滤,则需要确保UserName 也是$group 生成的文档的一部分。

因为$group将多个文档压缩为一个,所以如果多个被分组的文档对UserName有不同的值,你需要指定如何处理。选项是$last/$first 使用最后/第一个聚合文档的值(警告:在$group 之前没有显式的$sort,顺序不可预测),$addToSet 创建一个所有唯一的数组values 或$push 创建一个包含所有重复值的数组。

但很有可能,您希望在分组之前过滤带有不需要的文档的文档,因此更好的解决方案可能是将$match 移动到$group 之前。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-21
    • 2020-11-02
    • 2016-02-17
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    相关资源
    最近更新 更多