Robię projekt Node.js, który zawiera projekty podrzędne. Jeden podprojekt będzie miał jedną bazę danych Mongodb, a Mongoose będzie używany do pakowania i wysyłania zapytań do bazy danych. Ale problem w tym
- Mongoose nie pozwala na używanie wielu baz danych w jednej instancji Mongoose, ponieważ modele są zbudowane na jednym połączeniu.
Aby użyć wielu instancji mongoose, Node.js nie zezwala na wiele instancji modułów, ponieważ ma system buforowania
require()
. Wiem, że wyłącz buforowanie modułów w Node.js, ale myślę, że nie jest to dobre rozwiązanie, ponieważ jest potrzebne tylko w przypadku mangusty.Próbowałem użyć
createConnection()
iopenSet()
w mangusty, ale to nie było rozwiązanie.Próbowałem głęboko skopiować instancję mangusty ( http://blog.imaginea.com/deep-copy-in-javascript/ ), aby przekazać nowe instancje mangusty do projektu podrzędnego, ale rzuca
RangeError: Maximum call stack size exceeded
.
Chcę wiedzieć, czy istnieje możliwość używania wielu baz danych z mangustą lub jakiegokolwiek obejścia tego problemu? Ponieważ uważam, że mangusta jest dość łatwa i szybka. Lub inne moduły jako zalecenia?
useDb
polecenia, które używa tej samej puli połączeń.Zgodnie z drobną instrukcją ,
createConnection()
może być używany do łączenia się z wieloma bazami danych.Musisz jednak utworzyć osobne modele dla każdego połączenia / bazy danych:
Jestem prawie pewien, że możesz udostępniać schemat między nimi, ale musisz to sprawdzić, aby się upewnić.
źródło
useDb()
wersji 3.8 dostępna jest również płatnośćvar newSchema = new mongoose.Schema({ ... })
,var model2 = conn1.model('newModel', newSchema)
,var model2 = conn2.model('newModel', newSchema)
Dość późno, ale to może komuś pomóc. Obecne odpowiedzi zakładają, że używasz tego samego pliku dla połączeń i modeli.
W prawdziwym życiu istnieje duże prawdopodobieństwo, że podzielisz swoje modele na różne pliki. Możesz użyć czegoś takiego w swoim głównym pliku:
czyli właśnie tak jest to opisane w dokumentacji. A następnie w plikach modelu wykonaj coś takiego:
Gdzie myDB to nazwa Twojej bazy danych.
źródło
test
, a także do uniknięcia wielu połączeń. Jednak ja również.db
na końcu (const v1 = mongoose.connection.useDb('test').db
), ponieważ stara db nie musi być zarządzana mangustą.Alternatywnie Mongoose eksportuje konstruktora dla nowej instancji w instancji domyślnej. Więc coś takiego jest możliwe.
Jest to bardzo przydatne podczas pracy z oddzielnymi źródłami danych, a także gdy chcesz mieć oddzielny kontekst bazy danych dla każdego użytkownika lub żądania. Będziesz musiał być ostrożny, ponieważ podczas wykonywania tej czynności można utworzyć DUŻO połączeń. Pamiętaj, aby wywołać rozłączenie (), gdy instancje nie są potrzebne, a także ograniczyć rozmiar puli tworzonej przez każdą instancję.
źródło
await instance1.connection.collection('foo').insert({ foo: 'bar', }) await instance2.connection.collection('foo').insert({ foo: 'zoo', })
Trochę zoptymalizowane (przynajmniej dla mnie) rozwiązanie. zapisz to do pliku db.js i zażądaj tego wszędzie tam, gdzie jest to wymagane, i wywołaj to za pomocą wywołania funkcji i jesteś gotowy.
źródło