Sie müssen die Aggregationspipeline verwenden, um ein $slice zu erreichen aufgrund der Einschränkungen in der Projektanweisung, die Teil der Suchabfrage ist.
Die folgende Abfrage ist ungültig, weil das erste $slice würde ein Array anstelle eines Index und die Ausführung des äußeren Bereichs $slice zurückgeben schlägt fehl.
db.collection.find({"name":"foo"},{text: {$slice:[{$slice: [1,1]}]}})
Außerdem gibt es keine Möglichkeit, an einem projizierten Feld in derselben Projektanweisung zu arbeiten. Wenn möglich, hätten wir den Text weiter ändern können, indem wir ein $slice darauf angewendet hätten.
Der Weg zu gehen wäre:
Matchder Datensatz mit dem Namen als foo.Unwinddas Text-Array, um zur ersten Ebene zu gelangen.Unwinderneut, um das gewünschte Niveau zu erreichen.Groupdie Datensätze zusammen nach Namen.Projectder letzte Datensatz in der Gruppe, der auch das letzte Element des letzten verschachtelten Arrays ist.
Der Code:
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$group:{"_id":"$name","text":{$last:"$text"}}},
{$project:{"name":"$_id","text":1}}
])
oder wenn Sie ein Element projizieren möchten, das in einer bestimmten Reihenfolge erscheint, können Sie den $skip verwenden und $limit Operationen, um dies zu erreichen.
var orderOfElement = 2;
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$skip:orderOfElement -1},
{$limit:1}
])
Welches projiziert das zweite Element der Reihe nach in die verschachtelten Arrays.