Obtiene el n-ésimo elemento de una matriz en MongoDB

Como parte de mi documento en MongoDB, estoy almacenando una matriz de objetos. ¿Cómo puedo consultarlo solo para el 4º elemento de la matriz, por ejemplo? Así que no quiero que salga la matriz completa, solo el 4 ° elemento.

Use $slice .

 db.foo.find({ bar : "xyz" } , { my_array : { $slice : [n , 1] } } ) 

recuperará el enésimo elemento de la matriz “my_array” de todos los documentos en la colección foo donde bar = “xyz”.

Algunos otros ejemplos de la documentación de MongoDB:

 db.posts.find({}, {comments:{$slice: 5}}) // first 5 comments db.posts.find({}, {comments:{$slice: -5}}) // last 5 comments db.posts.find({}, {comments:{$slice: [20, 10]}}) // skip 20, limit 10 db.posts.find({}, {comments:{$slice: [-20, 10]}}) // 20 from end, limit 10 

Que puede leer aquí: http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields

Otra forma de hacerlo es usar la syntax de la matriz de actualización. Aquí, contribs.1 establece el segundo elemento en la matriz contribs para tener el valor ALGOL 58 (Tomado de la página del manual en la syntax de actualización )

 db.bios.update( { _id: 1 }, { $set: { 'contribs.1': 'ALGOL 58' } } ) 

Puede usar el operador $arrayElemAt new en MongoDB 3.2 para devolver el elemento en el índice de matriz especificado.


Manifestación:

Una colección llamada cestas contiene documentos que se ven así:

 { "_id" : ObjectId("578f326f6db61a299a383c5a"), "fruits" : [ "apple", "mango", "banana", "apricot", "cherry" ] } 

La siguiente consulta devuelve el elemento en el índice -2 (segundo elemento) en la matriz “fruits”.

 db.baskets.aggregate( [ { "$project": { "matched": { "$arrayElemAt": [ "$fruits", 1 ] } } } ] ) 

que produce

 { "_id" : ObjectId("578f326f6db61a299a383c5a"), "matched" : "mango" } 

Y la siguiente pregunta el elemento antes del último elemento en la matriz; por lo tanto, el elemento en el índice -2

 db.baskets.aggregate( [ { "$project": { "matched": { "$arrayElemAt": [ "$fruits", -2 ] } } } ] ) 

cuyos rendimientos:

 { "_id" : ObjectId("578f326f6db61a299a383c5a"), "matched" : "apricot" }