Czy Mongoose v3.6 + obsługuje teraz wstawianie wsadowe? Szukałem przez kilka minut, ale wszystko, co pasuje do tego zapytania, ma kilka lat, a odpowiedź była jednoznaczna nie.
Edytować:
Na przyszłość odpowiedzią jest użycie Model.create()
. create()
akceptuje tablicę jako pierwszy argument, więc możesz przekazać swoje dokumenty do wstawienia jako tablicę.
Zobacz dokumentację Model.create ()
Odpowiedzi:
Model.create () vs Model.collection.insert (): szybsze podejście
Model.create()
to zły sposób wykonywania wkładek, jeśli masz do czynienia z bardzo dużą masą. Będzie to bardzo powolne . W takim przypadku powinieneś użyćModel.collection.insert
, który działa znacznie lepiej . W zależności od wielkości masyModel.create()
nawet się rozbije! Próbowałem z milionem dokumentów, bez powodzenia. Korzystanie zModel.collection.insert
niego zajęło zaledwie kilka sekund.docs
jest tablicą dokumentów do wstawienia;options
jest opcjonalnym obiektem konfiguracyjnym - zobacz dokumentacjęcallback(err, docs)
zostanie wywołana po zapisaniu wszystkich dokumentów lub wystąpieniu błędu. W przypadku sukcesu, docs to szereg utrwalonych dokumentów.Jako autor Mongoose Punkty się tutaj metoda ta ominie wszelkich procedur walidacji i dostępu kierowca Mongo bezpośrednio. Jest to kompromis, który musisz zrobić, ponieważ obsługujesz dużą ilość danych, w przeciwnym razie nie byłbyś w stanie w ogóle wstawić ich do bazy danych (pamiętaj, że mówimy tutaj o setkach tysięcy dokumentów).
Prosty przykład
Aktualizacja 2019-06-22 : chociaż
insert()
nadal można go używać dobrze, został wycofany na korzyśćinsertMany()
. Parametry są dokładnie takie same, więc możesz go po prostu użyć jako zamiennika typu drop-in i wszystko powinno działać dobrze (cóż, wartość zwracana jest nieco inna, ale prawdopodobnie i tak jej nie używasz).Odniesienie
źródło
Model.collection
przechodzi bezpośrednio przez sterownik Mongo, tracisz wszystkie zgrabne rzeczy, w tym sprawdzanie poprawności i haczyki. Tylko coś do zapamiętania.Model.create
traci haczyki, ale nadal przechodzi przez weryfikację. Jeśli chcesz tego wszystkiego, musisz iterować inew MyModel()
Mongoose 4.4.0 obsługuje teraz wstawianie zbiorcze
Mongoose 4.4.0 wprowadza --true-- zbiorcze wstawianie z metodą modelu
.insertMany()
. Jest to znacznie szybsze niż zapętlanie.create()
lub udostępnianie tablicy.Stosowanie:
Lub
Możesz go śledzić na:
źródło
bulkWrite
? Zobacz tutaj: stackoverflow.com/questions/38742475/…fatal error allocation failed
. Ale jeśli używam collection.insert Działa idealnie.dateCreated : { type: Date, default: Date.now },
Rzeczywiście, możesz użyć metody „tworzenia” Mongoose, może ona zawierać tablicę dokumentów, zobacz ten przykład:
Funkcja wywołania zwrotnego zawiera wstawione dokumenty. Nie zawsze wiesz, ile elementów należy wstawić (stała długość argumentów, jak powyżej), więc możesz je przeglądać w pętli:
Aktualizacja: lepsze rozwiązanie
Lepszym rozwiązaniem byłoby użycie
Candy.collection.insert()
zamiastCandy.create()
- użyte w powyższym przykładzie - ponieważ jest szybsze (create()
wywołujeModel.save()
każdy element, więc jest wolniejszy).Więcej informacji można znaleźć w dokumentacji Mongo: http://docs.mongodb.org/manual/reference/method/db.collection.insert/
(dzięki arcseldonowi za wskazanie tego)
źródło
{type:'jellybean'}
zamiast{type:'jelly bean'}
? Przy okazji. jakie to dziwne typy? Czy są częścią Mongoose API?type
jest zwykle zarezerwowany w Mongoose do określania ADT obiektu bazy danych.Możesz wykonać zbiorcze wstawianie przy użyciu powłoki mongoDB, wstawiając wartości do tablicy.
źródło
YourModel.collection.insert()
collection.insert
odpowiedź została udzielona kilka tygodni przed tą odpowiedzią i wyjaśniona znacznie bardziej szczegółowo.Możesz wykonać zbiorcze wstawianie za pomocą mangusty, jako odpowiedzi o najwyższym wyniku. Ale przykład nie może działać, powinien być:
Nie używaj instancji schematu do wstawiania zbiorczego, powinieneś użyć zwykłego obiektu mapy.
źródło
Oto oba sposoby zapisywania danych za pomocą insertMany i save
1) Mongoose zapisuje
insertMany
masowo szereg dokumentów2) Mongoose zapisuje tablicę dokumentów w formacie
.save()
Dokumenty te będą zapisywać się równolegle.
źródło
Wygląda na to, że przy używaniu mangusty istnieje limit ponad 1000 dokumentów
Możesz użyć:
Ale jest to prawie dwa razy szybsze w przypadku testowania na 10000 dokumentów:
źródło
Udostępnianie działającego i odpowiedniego kodu z naszego projektu:
źródło
.insertMany
Rozwiązanie zostało już podane (i wyjaśnić), w tym 2016 odpowiedzi .