使用mongoDB中的(^)克拉进行数字搜索确实无法正常工作

时间:2015-07-20 11:51:33

标签: javascript regex node.js mongodb mongoose

无法在我的mongoDB集合中搜索数据类型是数字和克拉似乎不适合我  搜索查询

  db.collection.find({mobile : /^9/});

数据库收集

{
    "_id" : ObjectId(),
    "Name" : "Mr.XXX",
    "mobile" : NumberLong(9876543210),
    "date" : ISODate("2015-07-09T07:21:45.552Z"),
    "__v" : 0
}

/* 1 */
{
    "_id" : ObjectId(),
    "Name" : "Mr.YYY",
    "mobile" : NumberLong(887654210),
    "__v" : 0
}

但搜索结果似乎不适用于移动设备,而且适用于其他数据类型。

3 个答案:

答案 0 :(得分:1)

您无法对数字值执行正则表达式,但是您应该更改架构。

移动号码通常以许多国家/地区的0开头(例如英国),并且不遵循严格整数(NumberLong为)的规则,也不是正常的严格大小这样你就不应该将它们存储为数字类型,而是存储在字符串类型中,此时你可以对它们进行正则表达式。

因此,不要试图找到使用聚合或$where的一些奇怪的工作,而这两者都会导致痛苦的死亡,而应该改变您的架构以匹配您实际输入的信息。

答案 1 :(得分:0)

数据是“数字”,因此正则表达式在这里不起作用,因为它们只适用于“字符串”。

您可以对$where使用JavaScript评估,因为JavaScript可以投射“类型”:

db.collection.find(function() { return this.mobile.toString().match(/^9/) })

但这不是一个好主意,因为$where无法使用索引来匹配并依赖编码条件进行比较。

如果你需要进行这种匹配,那么你的“数字”数据需要是一个“字符串”,或者至少在文档中有一些带有“字符串”表示的东西:

{
    "_id" : ObjectId(),
    "Name" : "Mr.XXX",
    "mobile" : "9876543210",
    "date" : ISODate("2015-07-09T07:21:45.552Z"),
    "__v" : 0
}

然后,在匹配“字符串”时,$regex查询按预期工作。

db.collection.find({ "mobile": /^9/ })

答案 2 :(得分:0)

根据mongoDB $regex,它表示查询中模式匹配字符串的正则表达式正则表达式功能。首先,您应该使用{将mobile转换为String {3}},假设您的手机号码始终为10位数。

此聚合可能会变慢但符合您的条件,请查看以下聚合查询:

db.collectionName.aggregate([
{
    "$project": {
        "mobileToString": {
            "$substr": [
                "$mobile",
                0,
                10
            ]
        },
        "Name": 1,
        "mobile": 1,
        "date": 1,
        "__v": 1
    }
},
{
    "$match": {
        "mobileToString": /^9/
    }
},
{
    "$project": {
        "Name": 1,
        "mobile": 1,
        "date": 1,
        "__v": 1
    }
}
]).pretty()