无法在我的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
}
但搜索结果似乎不适用于移动设备,而且适用于其他数据类型。
答案 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()