2014-06-16 14 views
8

Według MongoDB documentation:Co to jest maksymalny rozmiar operacji wsadowej MongoDB?

Luzem Operacja Rozmiar

Operacja luzem może mieć co najwyżej 1000 operacji.

Jednak udało mi się wykorzystać większość z dużo większych operacji count (około 300k operacji) za pomocą Mongo 2.6 masowych operacji API z węzła-MongoDB rodzimymi (collection.initializeUnorderedBulkOp() itp)

Czy ta granica nieaktualne, czy po prostu coś mi brakuje? Czy wiesz, jaki jest rzeczywisty limit?

+0

Maksymalny rozmiar to jeden dokument BSON, którego bieżące limity są ustawione na 16m, czyli sposób, w jaki MongoDB komunikuje się, używając dokumentów BSON. – Sammaye

Odpowiedz

13

Otworzyłem ticket w Jira MongoDB. Odpowiedzieli:

Masz rację; ten limit wymaga pewnych wyjaśnień w dokumentacji. Limit jest na serwerze, ale sterowniki klienta ukrywają ograniczenia twórców aplikacji, dzieląc operacje zbiorcze na wiele partii.

+0

Nie wiedziałem tego, dzięki! – Sammaye

3

To interesujące stwierdzenie i jest nowością w dokumentacji od wersji 2.6, więc zauważysz, że nie było tego w sekcji, do której odwołujesz się w przypadku wcześniejszych wydań.

Oczywiście rzeczywista granica jest granicą BSON 16MB, jako, że maksymalny rozmiar jaki może być wysłany przez przewód jak to, co jest skutecznie jeden dokument BSON. Staje się to bardziej przejrzyste, gdy zdajesz sobie sprawę, że jest to interfejs interfejsu użytkownika, który działa na najwyższym poziomie, np. Formularz runCommand o nazwie update, jak pokazano tam dla "Aktualizacji zbiorczych", lub inaczej wstawia, które wyraźnie mogą po prostu przyjąć ten formularz.

Sposób, w jaki zazwyczaj zapisałbym to jako przykład, sprawdzałby modlulo obecnej iteracji podczas dodawania operacji zbiorczych i tylko "wykonuję" co jakiś czas. Nie dokładna składnia dla kierowcy węzła, ale w zasadzie:

var bulk = db.collection.initializeUnorderedBulkOp(); 
counter = 0; 

longArrayOrStream.forEach(function(doc) { 
    bulk.find({ "_id": doc._id }).update(
     { "$set": { "somefield": doc.somefield }}); 
    counter++; 

    if (counter % 500 == 0) { 
     bulk.execute(); 
     counter = 0; 
     bulk = db.collection.initializeUnorderedBulkOp(); 
    } 
}); 

if (counter > 0) 
    bulk.execute(); 

lub coś podobnego w zależności od tego, co robisz. Byłoby to znacznie mniej niż wolumeny, których używasz, ale głównie w poręcznych porcjach, które nie są zbyt duże w sieci i na pewno bezpiecznie poniżej 16 MB.

Limit BSON jest bezwzględnym ograniczeniem twardym, ale ze względów praktycznych, a także biorąc pod uwagę, że możesz chcieć sprawdzić stan błędu, który również otrzymasz w jednym dużym dokumencie w odpowiedzi, prawdopodobnie chcesz zachować te w mniejszych porcjach.

To wszystko jest lepsze niż wykonanie jednej operacji na raz, i nie wiem, czy naprawdę chciałbym wysłać do 16MB na przewód i/lub sprawdzić odpowiedź 16 MB na możliwe błędy.

Powiązane problemy