Wie frage ich nur Dokumente mit dem neuesten Zeitstempel einer Gruppe ab?

In der von mir abgefragten MongoDB-Sammlung repräsentiert jedes Dokument ein Element zu einem bestimmten Zeitpunkt. Beim Aktualisieren eines Dokuments wird ein neues Dokument mit derselben Element-ID und einem neuen Zeitstempel erstellt. Alle Artikel haben eindeutige Artikel-IDs.

Betrachten Sie zur Veranschaulichung dieses Beispiel. Wir beginnen mit einer Revision eines Artikels:

{
    _id: x,
    itemId: 123,
    createdOn: ISODate("2013-01-30T11:16:20.102Z"),
    field1: "foo",
    field2: "bar
}

Nach einem Update haben wir zwei Revisionen des Elements mit dem gleichenArtikel Identifikationsnummer und verschiedene Zeitstempel.

[{
  _id: x,
  itemId: 123,
  createdOn: ISODate("2013-01-30T11:16:20.102Z"),
  field1: "foo",
  field2: "bar"
},
{
  _id: y,
  itemId: 123,
  createdOn: ISODate("2014-02-09T14:26:20.102Z"),
  field1: "baz",
  field2: "fiz"
}]

Wie kann ich alle Elemente finden, die in ihrer letzten Überarbeitung eine bestimmte Abfrage erfüllen?

Mein aktueller (falscher) Ansatz ist es, zuerst die passenden Dokumente zu finden, dann nach Zeitstempel zu sortieren und sie nach zu gruppierenArtikel Identifikationsnummer, und geben Sie die Werte aus dem ersten Dokument in der Gruppe zurück:

ItemModel.aggregate({ $match: { field1: "foo"} }).sort({createdOn: -1}).group(
    {
        _id: '$itemId', // grouping key
        createdOn: {$first: '$createdOn'},
        field1: {$first: '$field1'},
        field2: {$first: '$field2'}
    }).exec(...);

Dies ist falsch, da es mit alten Revisionen von Elementen übereinstimmt. Nur die neuesten Überarbeitungen von Elementen sollten übereinstimmen. Im obigen Beispiel gibt dieser Ansatz Element "123" zurück, während das richtige Ergebnis eine leere Ergebnismenge ist.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage