Operadores MongoDB $ gt / $ lt con precios almacenados como cadenas

Estoy intentando consultar mi base de datos por precios mayores que / menores que un número especificado por el usuario. En mi databse, los precios se almacenan así:

{price: "300.00"} 

Según los documentos, esto debería funcionar:

 db.products.find({price: {$gt:30.00}}).pretty() 

Pero no obtengo resultados. También probé {price: {$gt:30}} .

¿Que me estoy perdiendo aqui?

¿Lo es porque los precios se almacenan como una cadena en lugar de un número en la base de datos? ¿Hay alguna forma de evitar esto?

Si tiene la intención de usar $ gt con cadenas, tendrá que usar expresiones regulares, lo que no es bueno en términos de rendimiento. Es más fácil crear un nuevo campo que contiene el valor numérico de precio o cambiar este tipo de campo a int / double. Una versión de JavaScript también debería funcionar, así:

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

como js lo convertirá en número antes de su uso. Sin embargo, los índices no funcionarán en esta consulta.

$gt es un operador que puede trabajar en cualquier tipo:

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

Devoluciones:

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

Si quiere comparar un número con $gt o $lt , entonces el valor en su documento también debe ser un número. Los tipos en MongoDB son estrictos y no se autoconvierten como lo harían en PHP. Para resolver su problema, asegúrese de almacenar los precios como números (flotantes o ints):

 db.so.drop(); db.so.insert( { price: 50.40 } ); db.so.insert( { price: 29.99 } ); db.so.find( { price: { $gt: 30 } } ); 

Devoluciones:

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

Alternativamente, puede convertir los valores a Int, según: http://www.quora.com/How-can-I-change-a-field-type-from-String-to-Integer-in-mongodb

 var convert = function(document){ var intValue = parseInt(document.field, 10); db.collection.update( {_id:document._id}, {$set: {field: intValue}} ); } db.collection.find({field: {$type:2}},{field:1}).forEach(convert)