MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Ist es möglich, in Mongo ein Stück von einem Stück zu bekommen?

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.