Mongo将字符串强制转换为数字以进行查询

fer*_*ver 4 mongodb

有没有一种方法可以对数字的字符串字段执行小于或等于查询?

示例数据

|           Id           |           Price           |
|           1            |           "1000.00"       |
|           2            |           "5400.00"       |
|           3            |           "750.00"        |
Run Code Online (Sandbox Code Playgroud)

当我执行此查询时,它返回所有记录:

db.MyCollection.find({ Price: {$lte: "1000.0"} })
Run Code Online (Sandbox Code Playgroud)

当我执行此查询时,它不返回任何内容:

db.MyCollection.find({ Price: {$lte: 1000.0} })
Run Code Online (Sandbox Code Playgroud)

dni*_*ess 9

更新(从MongoDB v4.0起有效):

您可以结合使用$ expr$ toDouble来实现所需的行为,如下所示:

db.MyCollection.find({ $expr: { $lte: [ { $toDouble: "$Price" }, 1000.0 ] } })
Run Code Online (Sandbox Code Playgroud)

原始答案(MongoDB v3.6及更低版本):

MongoDB无法将字符串转换为数字。因此,这里唯一的选择是使用可怕的$ where运算符:

db.MyCollection.find({ $where: "parseInt(this.Price) <= 1000" })
Run Code Online (Sandbox Code Playgroud)

这将不使用任何索引,并且速度并不很快,但是对于小型集合来说还是可以的。

尽管如此,我还是建议将数字存储为数字类型。因此,您应该将strings 转换为ints或longs(甚至可能是doubles),如下所示:如何在mongodb中将字符串转换为数值

  • 我觉得这很令人沮丧。使用MongoDB并不是要拥有一个灵活的架构(一天存储字符串,第二天存储数字,并且它们都可以工作)。现在,看来,我需要返回并将所有这些字符串数字值转换为数字。 (2认同)
  • @Joao,不能再同意你了。 (2认同)