首页 > 解决方案 > 是否可以使用排除 / ingore 字符串选项在 mongoose 中进行查询

问题描述

我不太清楚如何用几句话来解释标题。如果有使标题更易于理解的建议,请告诉我。

无论如何,我想问的是,我正在尝试通过 db 中的电话号码进行查询,但是 db 中的电话号码有两种不同的样式,一种是带有破折号的,一种是没有的

所以在 db 中,电话字段可能是

{phone: '1234567890'}
{phone: '123-456-1111'}

当用户尝试搜索号码时,用户可能会输入完整的 10 位数字1234561111123-456-1111. 当然,我可以替换所有破折号123-456-1111并成功1234561111

但是1234561111 仍然不匹配数据库来查询它。

我可以通过什么方式让这个查询工作。目前mongoose用来做查询。

提前感谢您的任何帮助和建议。

标签: javascriptnode.jsmongodbexpressmongoose

解决方案


如果我没记错的话,您想在 db 中搜索“1234567890”,其中电话可能是“123-456-7890”或“1234567890”。所以有两种技术。

第一个是:通过正则表达式搜索。这将匹配“123-456-7890”和“1234567890”。

db.test.find({phone: /123\-?456\-?7890/})

第二:如果您不想篡改搜索字符串,解决方案是使用聚合。

对于 MongoDB 4.4

db.test.aggregate([
{
    $addFields: {
        extractedPhone: { $replaceAll: { input: "$phone", find: "-", replacement: "" } }
    }
},
{
    $match: {
        extractedPhone: "1234567890"
    }
},
{
    $project: {
        extractedPhone: 0
    }
}
])

对于旧版本的 MongoDB

db.test.aggregate([
{
    $addFields: {
        extractedPhone: {
            $reduce: {
              input: { $split: ["$phone", "-"]},
              initialValue: '',
              in: {
                $concat: ['$$value', '$$this']
              }
            }
        }
    }
},
{
    $match: {
        extractedPhone: "1234567890"
    }
},
{
    $project: {
        extractedPhone: 0
    }
}
])

推荐阅读