对mongodb中的数字进行sql'like'操作
Posted
技术标签:
【中文标题】对mongodb中的数字进行sql\'like\'操作【英文标题】:sql 'like' operations on numbers in mongodb对mongodb中的数字进行sql'like'操作 【发布时间】:2014-06-14 17:21:21 【问题描述】:我正在尝试在 mongodb 中进行类似于 SQL 示例的查询:
SELECT * from example where contactphone like '4832%';
我的第一个想法是做这样的事情:
db.example.find( contactphone: /^4832/ )
但它不会返回我要查找的内容,因为contactphone 是一个号码。
在mongodb中对数字进行此类操作有什么好的做法吗?
编辑:电话号码可能是一个不好的例子。假设我需要找到所有包含数字 9 的数字。我怎样才能做到这一点?
【问题讨论】:
如果您需要LIKE
操作,我建议将电话号码存储为字符串。这也将允许具有前导零的国际号码,例如011468...
。也就是说,如果您有固定位数,您也可以使用$gt
和$lt
。
当你有一个算术没有意义的数字时——比如邮政编码、社会保险号码或电话号码——你应该始终将其存储为字符串,而不是整数。
【参考方案1】:
不要将电话号码存储为整数。将它们存储为字符串。当您有一个仅由数字组成且算术毫无意义的值(例如邮政编码、银行帐号或电话号码)时,将其存储为数字没有多大意义。
正如您已经注意到的,当您想要搜索数字序列时,几乎不可能搜索数字,因为计算机系统以二进制而不是十进制存储整数。 不能有前导零 当数字太长时,您将遇到整数溢出或将其转换为浮点数(由您的 MongoDB 驱动程序决定)。两者都会导致非常奇怪的行为。顺便说一句,所有这些都适用于几乎所有数据库,而不仅仅是 MongoDB。
但如果您绝对决心将它们保留为数字,那么您可以做两件事。
-
当未知位数固定时,您可以使用
$gt
和$lt
运算符来搜索范围。 contactphone:$gt:5556000, $lt:5556999
会找到所有模式为 5556xxx
的数字。
您可以使用$where
-query,它使用javascript 函数在内部将每个数字转换为字符串,然后将您的正则表达式应用于该字符串。 $where: "String(this.contactphone).match(/^4832/) != null"
。我希望您的数据库中没有太多文档,因为当您这样做时,此查询可能需要一段时间。
【讨论】:
感谢您的回答。 当然,你是对的。我一直在 psql 中这样做 - 由于与您提到的相同原因,将大量“数字”存储为字符串。这不是任何生产环境。我只是在任何地方实际使用 mongo 之前进行试验。当我在某些 CDR 上执行 mongoimport 时出现这种情况,并且 mongoimport 自动为这些电话号码类型设置:numberlong。我知道这不是那个问题,但是您知道在 mongoimporting 时为特定字段选择类型的方法吗? @Jarema 请将此作为一个新问题提出。 是的,这可能是一个更好的主意。问题链接(如果您有兴趣:)):***.com/questions/24223443/…以上是关于对mongodb中的数字进行sql'like'操作的主要内容,如果未能解决你的问题,请参考以下文章
如何在mongodb中以字母数字形式对1000000个元素数组进行排序