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:
Match
pladen med navnet som foo.Unwind
tekstarrayet for at komme til det første niveau.Unwind
igen for at nå det niveau, vi ønsker.Group
posterne sammen efter navn.Project
den 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.