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:
Match
posten med namnet som foo.Unwind
textfältet för att komma till den första nivån.Unwind
igen för att komma till den nivå vi vill ha.Group
posterna tillsammans efter namn.Project
den 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.