2010-08-19 12 views
18

Cuando tengo dos documentos MongoDB como este ...¿Es posible emitir un MongoDB-Query?

db.test.insert({"value" : "10123"}); 
db.test.insert({"value" : "160"}); 

El resultado de una consulta como:

db.test.find({"value" :{$gt : "12"} }); 

es ..

{ "_id" : ObjectId("4c6d1b92304326161b678b89"), "value" : "160" } 

Es obvio, que una cadena se realiza una comparación, de modo que mi primer valor no se devuelve. ¿Hay alguna forma de enviar contenido dentro de la consulta?

Algo así como:

db.test.find({ (int) "value" :{$gt : 12} }); 

sería grande. Una consulta como

db.test.find({"value" :{$gt : 12} }); // without the quotes around "12" 

no devuelve nada.

+2

¿Hay una razón por la que va a almacenar números enteros como cadenas? No sería mejor hacer db.test.insert ({"value": 10123}); –

+0

Eso es cierto, por supuesto .. En mi solicitud, recojo valores en formularios y se los paso a Mongo. Los valores POST y GET se escriben por string de forma predeterminada. Sospeché que el conductor se haría cargo de la conversión de tipo. Desafortunadamente ese no es el caso. Así que tienes razón, convierto los datos antes de insertarlos. Además, @niels hizo un buen punto ... usar una expresión javascript en realidad resuelve el problema. – rgroli

Respuesta

19

Usted puede usar la siguiente JavaScript expression:

db.test.find("this.value > 12") 

Este utiliza la conversión automática de JavaScript de cadena a número.

+0

¡Agradable! Eso resuelve el problema muy elegante. – rgroli

+8

solo tenga cuidado ya que no puede usar los índices – mstearn

+1

¿esto todavía funciona? parece que no funciona para los elementos de la matriz –

0

$ gt no estaba configurado para este caso de uso. Debería usar expresiones regulares para cadenas. Probablemente sea más fácil crear un nuevo campo con el número como número.

4

Tengo una solución similar, me parece que si puede usar el shell mongo, puede escribir una declaración para hacer esto en javascript, pero capaz de usar índices.

var myItems = [] 
var it = db.test.find({},{value:1}) 
while (it.hasNext()){ 
var item = it.next(); 
if(parseInt(item.value) > 12) 
    myItems.push(item); 
} 

Si desea que esto se ejecute más rápido que la solución anterior, debe asegurarse el índice en el campo de valor.

+0

Esto realmente no usa índices para lo que realmente necesita el índice para – casey

1

Para convertir la serie en el uso int este

db.test.find({'year': {$type: 2}}).forEach(
    function (x) { 
     x.value=new NumberInt(x.value); 
     db.test.save(x)} 
    ) 

Y después de eso se puede consultar directamente como:

db.test.find({"value" :{$gt : 12} }); 
Cuestiones relacionadas