Wyobraź mamy następujący komplet dokumentów przechowywanych w MongoDB:Grupa Mongo dokumenty autorstwa id i uzyskać najnowszy dokument datownik
{ "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", ... }
Chciałbym, aby uzyskać najnowsze statusu dla każdego fooId na podstawie znak czasu. Dlatego mój powrót będzie wyglądać następująco:
{ "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", ... }
Próbowałem go o to za pomocą agregacji za pomocą operatora group
, ale część Zastanawiam się czy jest to prosty sposób, aby uzyskać całość powrócić z agregacji, aby wyglądała tak samo, jak gdybym użył kwerendy wyszukiwania? Wygląda na to, że musisz określić wszystkie pola podczas grupowania, a to nie wydaje się rozszerzalne, jeśli dokumenty mogą mieć opcjonalne pola, które mogą być dla mnie nieznane. Bieżące zapytanie mam wygląda następująco:
db.collectionName.aggregate(
[
{ $sort: { timestamp: 1 } },
{
$group:
{
_id: "$fooId",
timestamp: { $last: "$timestamp" },
status: { "$last": "$status" },
otherInfo: { "$last": "$otherInfo" },
}
}
]
)
Jesteś robiąc to już we właściwy sposób. Oczywiście możesz użyć ['$$ ROOT'] (https://docs.mongodb.org/manual/reference/aggregation-variables/#variable.ROOT) i po prostu umieścić cały dokument w jednej właściwości, ale to nie jest ta sama struktura, teraz jest? Jeśli tak bardzo martwisz się "wypisywaniem" każdego pojedynczego pola, po prostu * "wygeneruj końcową instrukcję potoku' $ group' w kodzie "*. To bardzo prosta rzecz, a wszystkie zapytania MongoDB i wyciągi potokowe agregacji są po prostu "strukturami danych". –