sql >> Base de Datos >  >> NoSQL >> MongoDB

Recuperar una sola propiedad del documento

En MongoDB 2.0 y anteriores, esto no es posible. Lo que desea hacer es devolver un elemento específico de la matriz, pero eso no es lo que realmente está haciendo su proyección, solo devolverá la matriz completa y luego el elemento z de cada uno.

Sin embargo, con 2.2 (rc2 al momento de escribir esta respuesta), las cosas han mejorado un poco. Ahora puede usar $elemMatch como parte de su proyección (ver SERVER-2238 para más detalles) para que solo retire el elemento de matriz requerido. Por lo tanto, intente algo como esto:

db.foo.find({"ID":"123",'a':{$elemMatch:{'x':"/"}}},{_id : 0, 'a.$': 1})
//returns
{ "a" : [ { "x" : "/", "y" : "2000", "z" : "1000" } ] }

O simplemente use $elemMatch en la proyección misma, que puede pensar que es más limpia:

db.foo.find({"ID":"123"},{_id : 0, 'a':{$elemMatch:{'x':"/"}}})
//returns 
{ "a" : [ { "x" : "/", "y" : "2000", "z" : "1000" } ] }

Entonces, ahora, al menos la matriz devuelta es solo la que contiene solo las entradas que desea y puede simplemente hacer referencia al elemento z relevante (las proyecciones de elemMatch en un subdocumento aún no son compatibles).

Por último, pero no menos importante, en 2.2 tenemos el marco de agregación y una de las cosas que puede hacer (con el $project operador, es remodelar sus documentos y cambiar subdocumentos y elementos de matriz en matrices de nivel superior. Para obtener el resultado deseado, haría algo como esto:

db.foo.aggregate( 
        {$match : {"ID":"123"}},  
        {$unwind : "$a"},  
        {$match : {"a.x":"/"}},  
        {$project : {_id : 0, z : "$a.z"}}
)

El resultado se ve así:

{ "result" : [ { "z" : "1000" } ], "ok" : 1 }