Debe usar la canalización de agregación para lograr un $slice
cadena, debido a las limitaciones en la declaración del proyecto como parte de la consulta de búsqueda.
La siguiente consulta no es válida porque el primer $slice
devolvería una matriz, en lugar de un índice, y la ejecución del $slice
de ámbito externo falla.
db.collection.find({"name":"foo"},{text: {$slice:[{$slice: [1,1]}]}})
Además, no hay forma de trabajar en un campo proyectado en la misma declaración del proyecto; si fuera posible, podríamos haber modificado el texto aún más aplicándole un $segmento.
El camino a seguir sería:
Match
el registro con el nombre como foo.Unwind
la matriz de texto para llegar al primer nivel.Unwind
de nuevo para llegar al nivel que queremos.Group
los registros juntos por nombre.Project
el último registro en el grupo que también es el último elemento de la última matriz anidada.
El código:
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$group:{"_id":"$name","text":{$last:"$text"}}},
{$project:{"name":"$_id","text":1}}
])
o si desea proyectar un elemento que aparece en un orden particular, puede usar el $skip
y $limit
operaciones para lograr esto.
var orderOfElement = 2;
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$skip:orderOfElement -1},
{$limit:1}
])
Que proyecta el segundo elemento en orden en las matrices anidadas.