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

MongoDB聚合$match实现去空格不区分大小写城市搜索

MongoDB城市名称去空格+不区分大小写搜索方案

问题背景

文档结构示例:

{
    "_id": ObjectId("65ofb9104b1cf1519e4c5957"),
    "country": "us",
    "city": "New York"
}

需求:搜索newyork时,需匹配所有city字段为带空格格式(如New York)的文档,要求同时实现去除空格匹配和不区分大小写。

现有查询仅支持不区分大小写,无法处理空格:

db.getCollection('cities').aggregate([
    { $match: { "city": { '$regex':  'newyork' , $options: 'i' } } }
]);

解决方案

方案1:聚合管道处理字段后匹配

通过$replaceAll去除city字段的空格,转小写后与搜索词匹配:

db.getCollection('cities').aggregate([
    // 生成处理后的临时字段:去空格+转小写
    {
        $addFields: {
            processedCity: {
                $toLower: {
                    $replaceAll: { input: "$city", find: " ", replacement: "" }
                }
            }
        }
    },
    // 匹配处理后的字段与目标搜索词
    {
        $match: {
            processedCity: "newyork"
        }
    },
    // 可选:移除临时字段,保留原始文档结构
    {
        $project: {
            processedCity: 0
        }
    }
]);

方案2:正则表达式直接匹配

构造正则,在搜索词的每个字符之间允许任意数量的空格(包括零个),同时开启不区分大小写选项:

// 示例搜索词,实际使用时可动态生成正则
const searchTerm = "newyork";
const regexPattern = new RegExp(searchTerm.split('').join('\\s*'), 'i');

db.getCollection('cities').aggregate([
    {
        $match: {
            city: regexPattern
        }
    }
]);

该方案会匹配New York、newyork、N e w Y o r k等所有空格任意分布的格式,同时忽略大小写。

性能优化建议

如果数据量较大,上述查询可能触发全表扫描,可提前创建索引提升性能:

  • 创建计算字段索引:
db.cities.createIndex(
    { processedCity: 1 },
    {
        partialFilterExpression: { city: { $exists: true } },
        background: true
    }
);

创建后,方案1的查询会自动利用该索引加速匹配。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 16:27:24