我正在尝试在 mongodb 中执行类似于 SQL 示例的查询:
SELECT * from example where contactphone like '4832%';
我的第一个想法是做这样的事情:
db.example.find({ contactphone: /^4832/ })
但它没有返回我要查找的内容,因为联系电话是一个数字。
在 mongodb 中对数字进行此类操作是否有任何好的做法?
编辑:电话号码可能是一个不好的例子。比方说我需要找到所有包含数字 9 的数字。我怎样才能做到这一点?
最佳答案
不要将电话号码存储为整数。将它们存储为字符串。当您有一个仅由数字组成且算法毫无意义的值(如邮政编码、银行帐号或电话号码)时,将其存储为数字没有多大意义。
- 正如您已经注意到的,当您想搜索数字序列时,几乎不可能搜索到数字,因为计算机系统以二进制而不是十进制存储整数。
- 不能有前导零
- 当数字太长时,您要么遇到整数溢出,要么将其转换为 float (由您的 MongoDB 驱动程序自行决定)。两者都会导致非常奇怪的行为。
顺便说一句,所有这些都适用于几乎所有数据库,而不仅仅是 MongoDB。
但是如果您绝对下定决心将它们保留为数字,您可以做以下两件事。
- 当未知数字的数量固定时,您可以使用
$gt
和$lt
运算符来搜索范围。contactphone:{$gt:5556000, $lt:5556999}
会找到所有具有5556xxx
模式的号码。 - 你可以使用
$where
-query 使用 javascript 函数在内部将每个数字转换为字符串,然后将正则表达式应用于该字符串。$where: "String(this.contactphone).match(/^4832/) != null"
。我希望您的数据库中没有太多文档,因为当您这样做时,此查询可能需要一段时间。
关于sql 'like'对mongodb中数字的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24222428/