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:
Match
o registro com o nome como foo.Unwind
a matriz de texto para chegar ao primeiro nível.Unwind
novamente para chegar ao nível que queremos.Group
os registros juntos por nome.Project
o ú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.