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:
Match
der Datensatz mit dem Namen als foo.Unwind
das Text-Array, um zur ersten Ebene zu gelangen.Unwind
erneut, um das gewünschte Niveau zu erreichen.Group
die Datensätze zusammen nach Namen.Project
der 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.