You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在MongoDB的pymongo聚合中如何用$nin实现正则查询集过滤?

问题根因

你当前写法的核心错误是将正则表达式以普通字符串格式传入$nin:MongoDB对$nin数组内的字符串只会执行精确匹配,不会自动识别为正则规则做模糊匹配,因此筛选逻辑完全未生效。

修正后的聚合代码

直接将你需要的$not+$regex规则放入$match阶段即可,和你预期的find查询逻辑完全对齐:

.aggregate([
        {"$match": {"free_id": {
            "$not": {"$regex": "XXX-XXX/YXYXYXYXY/.*"}
        }}},
        {
            "$group": {
                "_id": "$free_id",
                "count": {"$sum": 1},
                "ts": {"$last": "$payload.ts"}
            }
        },
        {
            "$project": {
                "internal_id": {"$slice": [{"$split": ["$_id", "/"]}, 1, 1]},
                "document_count": "$count",
                "last_ts": "$ts"
            }
        },
        {
            "$group": {
                "_id": {"$first": "$internal_id"},
                "docs": {"$sum": "$document_count"},
                "last": {"$last": "$last_ts"}
            }
        },
    ])

如果后续需要在$in/$nin中使用多正则匹配,不要传入字符串,要传入正则对象:pymongo场景下可以用re.compile(r"你的正则规则")生成正则对象后放入数组即可生效。

性能优化建议

你提到的运行耗时长问题,可以通过给free_id字段建立普通索引优化:当前你使用的正则规则是固定前缀开头,符合MongoDB索引前缀匹配的生效条件,加索引后查询速度会有大幅提升。


内容的提问来源于stack exchange,提问作者creyD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 16:24:03