Du måste använda aggregeringspipelinen för att uppnå en $slice kedjan, på grund av att begränsningarna i projektbeskrivningen är en del av sökfrågan.
Frågan nedan är ogiltig eftersom den första $slice skulle returnera en array, istället för ett index, och exekveringen av den yttre scoped $slice misslyckas.
db.collection.find({"name":"foo"},{text: {$slice:[{$slice: [1,1]}]}})
Dessutom finns det inget sätt att arbeta på ett projicerat fält i samma projektbeskrivning, om möjligt hade vi kunnat modifiera texten ytterligare genom att applicera en $slice på den.
Vägen att gå skulle vara:
Matchposten med namnet som foo.Unwindtextfältet för att komma till den första nivån.Unwindigen för att komma till den nivå vi vill ha.Groupposterna tillsammans efter namn.Projectden sista posten i gruppen som också är det sista elementet i den senast kapslade arrayen.
Koden:
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$group:{"_id":"$name","text":{$last:"$text"}}},
{$project:{"name":"$_id","text":1}}
])
eller om du vill projicera ett element som visas i en viss ordning, kan du använda $skip och $limit åtgärder för att uppnå detta.
var orderOfElement = 2;
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$skip:orderOfElement -1},
{$limit:1}
])
Som projicerar det andra elementet i ordning i de kapslade arrayerna.