2012-08-10 80 views
10

En SQL que podía hacer algo así como¿Es posible devolver un campo calculado de una consulta MongoDB?

SELECT myNum, (myNum+1) as `increment` FROM myTable 

efectivamente haciendo matemáticas arbitrarias y otras funciones y devolver los como un campo en el resultado. ¿Se puede hacer lo mismo con MongoDB?

db.test.find({}, {_id:1, myNum:1, increment:function() { return this.myNum + 1;}}); 

Eso no devuelve un campo de "incremento" como era de esperar.

Todas las demás preguntas relacionadas que pude encontrar sobre este tema tratan con consultas GROUPed, que esta no es; Solo estoy agregando un campo "virtual" al documento cuando se extrae (¿se calcula el lado del cliente?).

Como alternativa, este problema parece ser un "mapa" sin un "reducir"; cada fila tiene su propio campo calculado. ¿Hay alguna forma de devolver el resultado de una función de mapa como resultado/cursor?

Respuesta

11

El nuevo en MongoDB 2.2 le permite agregar campos calculados a través del operador $project. Esto no es lo mismo que funciones arbitrarias porque necesita usar supported operators, pero proporciona una gran flexibilidad.

Aquí es su ejemplo de incrementar _id s en un nuevo campo myNum:

MongoDB shell version: 2.2.0-rc0 

> db.test.insert({_id:123}); 

> db.test.insert({_id:456}); 

> db.test.aggregate(
    { $project : { 
     _id : 1, 
    'myNum': { $add: [ "$_id", 1]} 
    }} 
) 
{ 
    "result" : [ 
     { 
      "_id" : 123, 
      "myNum" : 124 
     }, 
     { 
      "_id" : 456, 
      "myNum" : 457 
     } 
    ], 
    "ok" : 1 
} 
+0

bien que parece prometedor. Aunque la documentación enumera la versión 2.1 como la primera versión con esa característica, no 2.2. Lamentablemente, no tiene una función '$ count'; para mi propósito en el mundo real, tengo que contar un conjunto de subdocumentos. Eso y los repositorios de Fedora 16 solo tienen 2.0 actualmente, por lo que podría tener que hacer este lado del cliente – MidnightLightning

+1

@MidnightLightning: tiene razón en que el marco de agregación apareció por primera vez en las versiones de desarrollo 2.1.x. 2.2.0 será la versión estable/producción con esta característica. 2.2.0rc0 ha sido [disponible en mongodb.org/downloads](http://www.mongodb.org/downloads) desde mediados de julio. No puede lograr su ejemplo de un campo calculado a partir de un único documento con un mapa/reducir porque no se llamará a la función reduce() a menos que el mapa emita más de un documento para una clave determinada. – Stennie

+0

@MidnightLightning: vale la pena señalar que la [versión de producción de MongoDB 2.2.0] (http://docs.mongodb.org/manual/release-notes/2.2/) ya está disponible desde finales de agosto de 2012. – Stennie

Cuestiones relacionadas