2012-06-06 18 views
53

Chcę poznać najnowszy rekord w kolekcji. Jak to zrobić?Otrzymuj najnowsze informacje z kolekcji mongodb

Uwaga: Wiem następujące polecenie odpytuje prace:

1. db.test.find().sort({"idate":-1}).limit(1).forEach(printjson); 
2. db.test.find().skip(db.test.count()-1).forEach(printjson) 

gdzie IDATE ma timestamp dodał.

Problem jest dłuższy, ponieważ kolekcja to czas na odzyskanie danych, a moja kolekcja "testowa" jest naprawdę ogromna. Potrzebuję zapytania ze stałą odpowiedzią czasową.

Jeśli istnieje jakieś lepsze zapytanie wiersza poleceń mongodb, proszę dać mi znać.

Odpowiedz

17

muszę zapytać o odpowiedzi Stała czasowa

Domyślnie indeksy w MongoDB są B-drzew. Wyszukiwanie B-drzewa jest operacją O (logN), więc nawet find({_id:...}) nie zapewni stałych odpowiedzi O (1).

To oznacza, że ​​możesz sortować według _id, jeśli używasz ObjectId dla swoich ID. See here for details. Oczywiście, nawet to jest dobre tylko do ostatniej sekundy.

Możesz uciec się do "pisania dwa razy". Napisz raz do głównej kolekcji i napisz ponownie do kolekcji "ostatniej aktualizacji". Bez transakcji nie będzie to idealne, ale z tylko jednym elementem w kolekcji "ostatniej aktualizacji" zawsze będzie szybko.

+2

widzę wiele rozwiązań NoSQL i MongoDB opowiada "pisanie dwa razy", głównie dla posiadaczy count kiedy rozmiar danych staje się bardzo duży. Zgaduję, że to powszechna praktyka? – Vinny

+0

MongoDB nie spala się bardzo często na dysku i nie zawiera transakcji, więc zapisy stają się znacznie szybsze. Koniecznością jest tutaj, aby zachęcać do znormalizowania danych, które często prowadzą do wielu zapisów. Oczywiście, jeśli uzyskasz przepustowość zapisu 10x lub 100x (co widziałem), to 2x lub 3x zapisy są wciąż znaczną poprawą. –

14

To daje ostatni dokument, o collection

db.collectionName.findOne({}, {sort:{$natural:-1}}) 

$natural:-1 oznacza porządek odwrotny od tego, który rekordy są wstawiane w

Edit. Dla wszystkich downvoters, powyżej jest Składnia mongoose, Składnia mongo CLI to: db.collectionName.find({}).sort({$natural:-1}).limit(1)

+6

Twoja składnia wydaje się być błędna. Nie mogę go uruchomić tak, jak ty to masz. Co to jest praca: "db.punchdeck.findOne ({$ query: {}, $ orderby: {$ natural: -1}}) ' –

+0

Nie wiem, dlaczego wszystkie downvotes - ten kod działa idealnie dla mnie i jest szybki –

+1

@dark_ruby Zapytanie zwraca błąd "$ err ":" Canonalize query: BadValue Nieobsługiwana opcja projekcji: sort: {$ natural: -1.0} ", –

78

To jest powtórka poprzedniej odpowiedzi, ale jest bardziej prawdopodobne, że ork w różnych wersjach mongodb.

db.collection.find().limit(1).sort({$natural:-1}) 
+6

' db.collection.find(). limit (1) .sort ({$ natural: -1}) .pretty() 'jeśli chcesz, żeby wyglądał ładnie – Antoine

+0

Jaka jest różnica w tej kolejności:' '' db.collection.find(). sort ({$ natural: -1}). limit (1). pretty() '' ' – Leo

+0

@Digits, jaki wpływ będzie miał na wydajność, jeśli na końcu umieścimy ograniczenie, w jaki sposób ostatni rekord jest pobierany, gdy ograniczasz wyjście do tylko jednego dokumentu i musi to być najwyższy dokument w kolekcji. –

-1

php7.1 MongoDB:
$data = $collection->findOne([],['sort' => ['_id' => -1],'projection' => ['_id' => 1]]);

0

Moje rozwiązanie:

db.collection("name of collection").find({}, {limit: 1}).sort({$natural: -1})

Powiązane problemy