Você precisa usar o pipeline de agregação para obter um
$slice chain, devido às limitações na declaração do projeto fazer parte da consulta de localização. A consulta abaixo é inválida porque o primeiro
$slice retornaria uma matriz, em vez de um índice, e a execução do $slice com escopo externo falha. db.collection.find({"name":"foo"},{text: {$slice:[{$slice: [1,1]}]}})
Além disso, não há como trabalhar em um campo projetado na mesma declaração de projeto, se possível, poderíamos ter modificado o texto ainda mais aplicando um $slice nele.
O caminho seria:
Matcho registro com o nome como foo.Unwinda matriz de texto para chegar ao primeiro nível.Unwindnovamente para chegar ao nível que queremos.Groupos registros juntos por nome.Projecto último registro no grupo que também é o último elemento do último array aninhado.
O código:
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$group:{"_id":"$name","text":{$last:"$text"}}},
{$project:{"name":"$_id","text":1}}
])
ou se você quiser projetar um elemento aparecendo em uma ordem específica, então você pode usar o
$skip e $limit operações para conseguir isso. var orderOfElement = 2;
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$skip:orderOfElement -1},
{$limit:1}
])
Que projeta o segundo elemento em ordem nas matrizes aninhadas.