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:
Matchel registro con el nombre como foo.Unwindla matriz de texto para llegar al primer nivel.Unwindde nuevo para llegar al nivel que queremos.Grouplos registros juntos por nombre.Projectel ú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.