【问题标题】:$regexMatch after converting number $toString not working as expected转换数字 $toString 后的 $regexMatch 未按预期工作
【发布时间】:2020-07-30 12:57:56
【问题描述】:

这个表达式有效:

db.users.findOne({ '$expr': { '$regexMatch': { input: { '$toString': '$contact_number' }, regex: /78316/ } }})

while 表达式长度大于 5 个字符的表达式不返回结果:

db.users.findOne({ '$expr': { '$regexMatch': { input: { '$toString': '$contact_number' }, regex: /783160/ } }})

任何关于匹配模式与数字 mongo 字段的帮助将不胜感激!

【问题讨论】:

  • 请将所有内容作为文本添加到问题中。
  • 并包含 shell 语句以使用一个测试文档填充集合。
  • 如果有帮助,请您批准/赞成答案。否则让我们知道缺少什么
  • @D.SM 道歉,我在这里不是很活跃,试图改变它。
  • @Gibbs ans 非常有帮助:D,谢谢

标签: mongodb mongoose mongodb-query aggregation-framework


【解决方案1】:

原因是你存储的联系电话太长了。

当您执行toString 时,它会转换为科学字符串表示法。我不确定是toString还是mongo-drivers转换的。

Play - 转换为字符串时可以看到它是如何转换的

当您查找 78316 时,它是字符串表示法的一部分。因此匹配。

当您搜索 783160 时,它不是字符串表示法的一部分。所以不返回任何文档。

Play - 78316e 匹配。

这是因为科学记数法的默认精度。如果您现在可以更改,最好将联系电话存储为字符串。

【讨论】:

  • 感谢 Gibbs,这对您有很大帮助。使用$toLong 运算符后能够使其工作。 PS。现在将 contact_number 更改为 String 将不是一个小的重构,它会在内部和使用我们托管的 api 的应用程序中产生不可预测的影响。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多