U moet de aggregatiepijplijn gebruiken om een $slice . te verkrijgen keten, vanwege de beperkingen in de projectverklaring die deel uitmaakt van de zoekopdracht.
De onderstaande zoekopdracht is ongeldig omdat de eerste $slice zou een array retourneren, in plaats van een index, en de uitvoering van de buitenste scoped $slice mislukt.
db.collection.find({"name":"foo"},{text: {$slice:[{$slice: [1,1]}]}})
Bovendien is er geen manier om aan een geprojecteerd veld in dezelfde projectverklaring te werken, indien mogelijk hadden we de tekst verder kunnen wijzigen door er een $slice op toe te passen.
De manier om te gaan zou zijn:
Matchhet record met de naam foo.Unwindde tekstarray om naar het eerste niveau te gaan.Unwindopnieuw om het gewenste niveau te bereiken.Groupde records samen op naam.Projecthet laatste record in de groep dat ook het laatste element is van de laatste geneste array.
De code:
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$group:{"_id":"$name","text":{$last:"$text"}}},
{$project:{"name":"$_id","text":1}}
])
of als u een element in een bepaalde volgorde wilt projecteren, dan kunt u de $skip gebruiken en $limit operaties om dit te bereiken.
var orderOfElement = 2;
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$skip:orderOfElement -1},
{$limit:1}
])
Welke het tweede element op volgorde projecteert in de geneste arrays.