Du skal bruge aggregeringspipelinen for at opnå en $slice kæde, på grund af begrænsningerne i projekterklæringen, der er en del af søgeforespørgslen.
Forespørgslen nedenfor er ugyldig, fordi den første $slice ville returnere et array i stedet for et indeks og udførelsen af den ydre scoped $slice mislykkes.
db.collection.find({"name":"foo"},{text: {$slice:[{$slice: [1,1]}]}})
Desuden er der ingen måde at arbejde på et projekteret felt i den samme projekterklæring, hvis det var muligt, kunne vi have ændret teksten yderligere ved at anvende en $slice på den.
Vejen at gå ville være:
Matchpladen med navnet som foo.Unwindtekstarrayet for at komme til det første niveau.Unwindigen for at nå det niveau, vi ønsker.Groupposterne sammen efter navn.Projectden sidste post i gruppen, som også er det sidste element i det sidst indlejrede array.
Koden:
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$group:{"_id":"$name","text":{$last:"$text"}}},
{$project:{"name":"$_id","text":1}}
])
eller hvis du ønsker at projicere et element, der vises i en bestemt rækkefølge, kan du bruge $skip og $limit operationer for at opnå dette.
var orderOfElement = 2;
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$skip:orderOfElement -1},
{$limit:1}
])
Som projicerer det andet element i rækkefølge i de indlejrede arrays.