Group Mongo Dokumente nach ID und das neueste Dokument nach Zeitstempel erhalten

Stellen Sie sich vor, wir haben die folgenden Dokumente in Mongodb gespeichert:

{ "fooId" : "1", "status" : "A", "timestamp" : ISODate("2016-01-01T00:00:00.000Z") "otherInfo" : "BAR", ... }
{ "fooId" : "1", "status" : "B", "timestamp" : ISODate("2016-01-02T00:00:00.000Z") "otherInfo" : "BAR", ... }
{ "fooId" : "1", "status" : "C", "timestamp" : ISODate("2016-01-03T00:00:00.000Z") "otherInfo" : "BAR", ... }
{ "fooId" : "2", "status" : "A", "timestamp" : ISODate("2016-01-01T00:00:00.000Z") "otherInfo" : "BAR", ... }
{ "fooId" : "2", "status" : "B", "timestamp" : ISODate("2016-01-02T00:00:00.000Z") "otherInfo" : "BAR", ... }
{ "fooId" : "3", "status" : "A", "timestamp" : ISODate("2016-01-01T00:00:00.000Z") "otherInfo" : "BAR", ... }
{ "fooId" : "3", "status" : "B", "timestamp" : ISODate("2016-01-02T00:00:00.000Z") "otherInfo" : "BAR", ... }
{ "fooId" : "3", "status" : "C", "timestamp" : ISODate("2016-01-03T00:00:00.000Z") "otherInfo" : "BAR", ... }
{ "fooId" : "3", "status" : "D", "timestamp" : ISODate("2016-01-04T00:00:00.000Z") "otherInfo" : "BAR", ... }

Ich möchte den neuesten Status für jedes Feld basierend auf dem Zeitstempel erhalten. Daher würde meine Rückkehr so aussehen:

{ "fooId" : "1", "status" : "C", "timestamp" : ISODate("2016-01-03T00:00:00.000Z") "otherInfo" : "BAR", ... }
{ "fooId" : "2", "status" : "B", "timestamp" : ISODate("2016-01-02T00:00:00.000Z") "otherInfo" : "BAR", ... }
{ "fooId" : "3", "status" : "D", "timestamp" : ISODate("2016-01-04T00:00:00.000Z") "otherInfo" : "BAR", ... }

Ich habe versucht, dies durch Aggregation mit demgroup operator, aber der Teil, den ich frage, gibt es eine einfache Möglichkeit, das gesamte Dokument von einer Aggregation zurückzugewinnen, sodass es so aussieht, als hätte ich eine Suchabfrage verwendet? Es scheint, als müssten Sie beim Gruppieren alle Felder angeben, und das scheint nicht erweiterbar zu sein, wenn Dokumente optionale Felder enthalten können, die mir möglicherweise unbekannt sind. Die aktuelle Abfrage, die ich habe, sieht folgendermaßen aus:

db.collectionName.aggregate(
   [
     { $sort: { timestamp: 1 } },
     {
       $group:
         {
           _id: "$fooId",
           timestamp: { $last: "$timestamp" },
           status: { "$last": "$status" },
           otherInfo: { "$last": "$otherInfo" },
         }
     }
   ]
)

Antworten auf die Frage(6)

Ihre Antwort auf die Frage