Uzyskaj ostatnie dokumenty z odrębnymi kryteriami
Mam problem z wymyśleniem dobrego sposobu wykonania pewnego zapytania MongoDb. Po pierwsze, oto jakie zapytanie chcę zrobić. Załóż prostą bazę danych, która rejestruje zdarzenia wejścia i wyjścia (i ewentualnie inne działania, nie ma znaczenia) za pomocą machnięcia karty elektronicznej. Jest więc kolekcja o nazwieswipelog
z prostymi dokumentami, które wyglądają tak:
{
_id: ObjectId("524ab4790a4c0e402200052c")
name: "John Doe",
action: "entry",
timestamp: ISODate("2013-10-01T1:32:12.112Z")
}
Teraz chcę wymienić nazwy i ich ostatnie czasy wprowadzania (i inne pola, które chcę, ale przykład poniżej używa tylko tych dwóch pól).
Aktualne rozwiązanieOto, co mam teraz, jako „jeden liner” dla konsoli JavaScript MongoDb:
db.swipelog.distinct('name')
.forEach( function(name) {
db.swipelog.find( { name: name, action:"entry" } )
.sort( { $natural:-1 } )
.limit(1)
.forEach( function(entry) {
printjson( [ entry.name, entry.timestamp ] )
})
})
Który drukuje coś w stylu:
[ "John Doe", ISODate("2013-10-01T1:32:12.112Z")]
[ "Jane Deo", ISODate("2013-10-01T1:36:12.112Z")]
...
PytanieMyślę, że powyższe ma oczywisty problem skalowania. Jeśli istnieje sto nazw, do bazy danych zostanie wysłane 1 + 100 zapytań. Więc jaki jest dobry / poprawny sposób na uzyskanie „ostatniego”timestamp
każdego odrębnegoname
„? Zmiana struktury bazy danych lub dodanie niektórych kolekcji jest w porządku, jeśli to ułatwia.