2013-06-06 14 views
36

Czy można znaleźć największy rozmiar dokumentu w MongoDB?Znajdź największy rozmiar dokumentu w MongoDB

db.collection.stats() pokazuje średni rozmiar, który nie jest tak naprawdę reprezentatywny, ponieważ w moim przypadku rozmiary mogą się znacznie różnić.

+0

nie wiem co kierowca używasz, ale powinieneś być w stanie zobaczyć [size bson] (https://github.com/mongodb/mongo-c-driver/blob /master/src/bson.h#L141) jakoś. Zrób to i przejrzyj tabelę, aby dowiedzieć się, jaki jest największy dokument. – vinipsmaker

+0

Nie łatwo, nie ma operatora '$ documentSize' w zapytaniu MongoDB, a' $ size' robi coś zupełnie innego. Prawdziwy sposób w większości sterowników po stronie klienta, w tym javascript polega na użyciu pomocnika po stronie klienta. – Sammaye

Odpowiedz

72

Możesz użyć małego skryptu powłoki, aby uzyskać tę wartość.

Uwaga: Po zrobi pełne skanowanie tabeli

var max = 0; 
db.test.find().forEach(function(obj) { 
    var curr = Object.bsonsize(obj); 
    if(max < curr) { 
     max = curr; 
    } 
}) 
print(max); 
+0

Dzięki! To działało idealnie. – sashkello

+0

niesamowite, czy możemy uzyskać identyfikator obiektu z największego dokumentu? – timfeirg

+3

Zachowaj dodatkową zmienną, która przechowuje '_id', a ta zmienna jest aktualizowana, gdy kiedykolwiek zmieni się wartość' max'. –

12

Uwaga: To będzie próbował zapisać cały zestaw wyników w pamięci (od .toArray). Ostrożnie na dużych zbiorach danych. Nie używaj w produkcji! Odpowiedź Abisheka ma tę zaletę, że działa nad kursorem, zamiast w całej tablicy pamięci.

Jeśli chcesz także _id, spróbuj tego. Podane zbiór nazywany „wnioski”:

// Creates a sorted list, then takes the max 
db.requests.find().toArray().map(function(request) { return {size:Object.bsonsize(request), _id:request._id}; }).sort(function(a, b) { return a.size-b.size; }).pop(); 

// { "size" : 3333, "_id" : "someUniqueIdHere" } 
+0

Po uruchomieniu zaakceptowanej odpowiedzi, jest to następny skrypt, który każdy chciałby uruchomić! – Mrchief

+0

To jest najlepsza odpowiedź, którą widziałem! – mes

+1

Pojawia się błąd z uruchomieniem tego: Błąd: asercja src \ mongo \ util \ net \ message_port.cpp: 195 src/mongo/shell/query.js: 113 –

1

Jeśli pracujesz z ogromnej kolekcji, ładuje je wszystkie naraz do pamięci nie będzie działać, ponieważ będziesz potrzebować więcej pamięci RAM niż wielkość całej kolekcji aby to działało.

Zamiast tego można przetworzyć całą kolekcję w partiach stosując następujący pakiet stworzyłem: https://www.npmjs.com/package/mongodb-largest-documents

Wszystko co musisz zrobić, to podać ciąg połączenia i zbieranie nazwę MongoDB. Skrypt wypisze najwyższe X największych dokumentów, gdy zakończy przechodzenie całej kolekcji w partiach.

Preview

+0

To jest dokładnie to, na co pozwala wbudowany kursor. Przesyła dane zamiast przechowywać całą kolekcję do pamięci RAM. – dmo

+0

Witam @dmo, czy mógłbyś podać polecenie osiągnięcia tego poprzez wbudowany kursor? –

+0

Funkcja collection.find() zwraca kursor. Kursor jest strumieniem danych. Więc w JS możesz zrobić coś takiego ... https://jsfiddle.net/ro6efkdz/ – dmo

Powiązane problemy