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:
Match
het record met de naam foo.Unwind
de tekstarray om naar het eerste niveau te gaan.Unwind
opnieuw om het gewenste niveau te bereiken.Group
de records samen op naam.Project
het 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.