价格存储为字符串的MongoDB$gt/$lt运算符

价格存储为字符串的MongoDB$gt/$lt运算符,mongodb,Mongodb,我正在尝试查询数据库中大于/小于用户指定数字的价格。在我的数据库中,价格的存储方式如下: {price: "300.00"} 根据文件,这应该是可行的: db.products.find({price: {$gt:30.00}}).pretty() 但是我没有得到任何结果。我还尝试了{price:{$gt:30} 我错过了什么 这是因为价格在数据库中存储为字符串而不是数字?有办法解决这个问题吗?如果您打算在字符串中使用$gt,就必须使用regex,这在性能方面不是很好。只需创建一个保存pri

我正在尝试查询数据库中大于/小于用户指定数字的价格。在我的数据库中,价格的存储方式如下:

{price: "300.00"}
根据文件,这应该是可行的:

db.products.find({price: {$gt:30.00}}).pretty()
但是我没有得到任何结果。我还尝试了
{price:{$gt:30}

我错过了什么


这是因为价格在数据库中存储为字符串而不是数字?有办法解决这个问题吗?

如果您打算在字符串中使用$gt,就必须使用regex,这在性能方面不是很好。只需创建一个保存price的数值的新字段或将此字段类型更改为int/double就更容易了。javascript版本也应该可以工作,如下所示:

db.products.find("this.price > 30.00")

因为js会在使用前将其转换为数字。但是,索引不能用于此查询。

$gt
是一个可以用于任何类型的运算符:

db.so.drop();
db.so.insert( { name: "Derick" } );
db.so.insert( { name: "Jayz" } );
db.so.find( { name: { $gt: "Fred" } } );
返回:

{ "_id" : ObjectId("51ffbe6c16473d7b84172d58"), "name" : "Jayz" }
{ "_id" : ObjectId("51ffbf2016473d7b84172d5b"), "price" : 50.4 }
如果要与带有
$gt
$lt
的数字进行比较,则文档中的值也需要是一个数字。MongoDB中的类型是严格的,不会像f.e.在PHP中那样进行自动转换。为了解决您的问题,请确保将价格存储为数字(浮点或整数):

返回:

{ "_id" : ObjectId("51ffbe6c16473d7b84172d58"), "name" : "Jayz" }
{ "_id" : ObjectId("51ffbf2016473d7b84172d5b"), "price" : 50.4 }

或者,您可以将值转换为Int,如下所示:


如果您有更新版本的mongodb,则可以执行以下操作:

$expr: {
          $gt: [
             { $convert: { input: '$price', to: 'decimal' } },
             { $convert: { input: '0.0', to: 'decimal' } }
               ]
              }
$expr操作员:


$convert OPETOR:

Mongo 4.0
开始,有一个新的聚合运算符,它可以从各种类型转换为双精度(在本例中是从字符串):


哇,我不知道你可以在查询中使用javascript。太棒了,谢谢。无论如何,我会把它转换成一个数字,但这很有帮助。你会希望价格是int-only@Jascination。JS执行将不使用索引,因此在这种情况下它几乎没有任何用处,更容易使你的模式正确。请避免$where,它是在JavaScript中运行的,并且会给性能带来很大的影响$gt也可以用于其他类型。这种方式非常慢。巨大的性能影响。所比较的字符串不相似。它应该使用“30.00”来工作
// { price: "300.00" }
// { price: "4.2" }
 db.collection.find({ $expr: { $gt: [{ $toDouble: "$price" }, 30] } })
// { price: "300.00" }