对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个元素数组进行排序

如何对对象数据的mongodb聚合数组进行分组以对同一日期的数字求和

在Mongodb中使用数字对降序字符串进行排序

MongoDB增量备份

mongodb模式模型设计及编码-Mongoose

MongoDB:对文档集进行设置操作,如何操作?