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

Wie bekomme ich die letzten N Datensätze jeder Gruppe in Mongodb?

In mongoDB 3.2 Sie können dies durchführen, indem Sie die aggregierte Abfrage der folgenden Form verwenden:

db.collection.aggregate(
  {$sort: {created: -1}},
  {$group: {_id:'$city', title:{$push: '$title'}},
  {$project: {_id:0, city: '$_id', mostRecentTitle: {$slice: ['$title', 0, 2]}}}
)

Es ist sehr schwierig, dasselbe mit MongoDB 3.0 zu erreichen. Um dies in 3.0 zu erreichen, gibt es einen sehr schmutzigen Trick. Es beinhaltet ein paar Schritte und andere Sammlungen.

Führen Sie zuerst eine Aggregation durch und geben Sie das Ergebnis in eine temporäre Sammlung namens 'aggr_out'

aus

Abfrage:

db.collection.aggregate([
  {$sort: {created: -1}},
  {$group: {_id:'$city', title:{$push: '$title'}},
  {$project: {city: '$_id', mostRecentTitle: '$title'}},
  {$out: 'aggr_out'}]
)

Mit der obigen Abfrage hat mostRecentTitle alle aktuellen Titel, sortiert nach Index 0, 1, 2, ... Wenn Sie mit diesem Ergebnis zufrieden sind, verwenden Sie dies, da Sie das Ergebnis bereits in den Indizes 0, 1 und 2 von mostRecentTitle haben. Andere Titel können auf der Anwendungsseite einfach ignoriert werden.

Wenn Sie dennoch nicht zufrieden sind, aktualisieren Sie die Ausgabesammlung „aggr_out“ und lesen Sie Daten aus dieser Sammlung. Die Abfrage ist,

db.aggr_out.update(
  {},
  {$push: {
    mostRecentTitle: {$each:[], $slice:3}
    }
  }
)

Die obige Operation schneidet das Array mostRecentTitle so, dass es die letzten drei Titel enthält. Lesen Sie diese Sammlung durch, um das gewünschte Ergebnis zu erzielen.