Jak mogę wypełnić „komponenty” w przykładowym dokumencie:
{
"__v": 1,
"_id": "5252875356f64d6d28000001",
"pages": [
{
"__v": 1,
"_id": "5252875a56f64d6d28000002",
"page": {
"components": [
"525287a01877a68528000001"
]
}
}
],
"author": "Book Author",
"title": "Book Title"
}
To jest mój JS, w którym otrzymuję dokument od Mongoose:
Project.findById(id).populate('pages').exec(function(err, project) {
res.json(project);
});
...populate('pages pages.page.components').exec...
, otrzymuję to samo, co podano w przykładowym dokumencie. Nic się nie zmienia.Odpowiedzi:
Mongoose 4.5 to obsługuje
Możesz dołączyć do więcej niż jednego głębokiego poziomu
źródło
pages.$.page.component
nie jestpages.$.component
. Skąd wie, że ma wyglądać w obiekcie strony?To działa dla mnie:
Dokumentacja: Model.populate
źródło
Jak zauważyli inni,
Mongoose 4
popiera to. Bardzo ważne jest, aby pamiętać, że w razie potrzeby możesz powtórzyć również głębiej niż jeden poziom - chociaż nie jest to odnotowane w dokumentach:źródło
W ten sposób możesz wypełnić wiele zagnieżdżonych dokumentów.
źródło
populate: ['components','AnotherRef']
populate: 'components AnotherRef'
To najlepsze rozwiązanie:
źródło
page
ma inne właściwości, których nie można wypełnić.Zauważyłem, że jest to bardzo pomocne w tworzeniu feathersjs przed hookiem, aby wypełnić głęboką relację na poziomie ref. Modele z mangustą po prostu mają
następnie w feathersjs przed hakiem:
Tak proste w porównaniu z innymi metodami, starałem się to osiągnąć.
źródło
Znalazłem to pytanie poprzez inne pytanie, które było specyficzne dla KeystoneJS, ale zostało oznaczone jako zduplikowane. Jeśli ktoś tutaj może szukać odpowiedzi na Keystone, w ten sposób zrobiłem moje głębokie zapytanie w Keystone.
Dwupoziomowa populacja Mongoose przy użyciu KeystoneJs [duplikat]
źródło
Możesz to zrobić również za pomocą
$lookup
agregacji i prawdopodobnie najlepszym sposobem, ponieważ teraz zaludnienie jest wymarciem przez mongoźródło
Mongoose 5.4 to obsługuje
źródło
Dla kogoś, kto ma problem
populate
i też chce to zrobić:clients
,users
,rooms
,messasges
.refPath
lub dynamiczne odniesieniepopulate
zpath
model
opcjami ifindOneAndReplace
/replaceOne
z$exists
KONTEKST
Cel
clients
,users
&bot
.clients
lubusers
jego modele Mongoose. Modele klienta typu _sender toclients
, dla użytkownika tousers
.Schemat wiadomości :
ROZWIĄZANIE
Moje żądanie API po stronie serwera
Mój kod
Funkcja narzędzia (w
chatUtils.js
pliku), aby uzyskać typ wiadomości, którą chcesz zapisać:Po mojej stronie serwera (używając Nodejs), aby otrzymać prośbę o zapisanie wiadomości:
WSKAZÓWKI :
W przypadku bazy danych:
refPath
, używamy narzędzia,getSenderModel
które jest używane wpopulate()
. To z powodu bota.sender.type
Może być:users
z jego bazy danych,clients
z jego bazy danych ibot
bez bazy danych. PlikrefPath
Potrzebuje prawdziwego modelu odniesienia, jeśli nie, Mongooose rzucać błąd.sender._id
można wpisaćObjectId
dla użytkowników i klientów lubnull
dla bota.Logika żądań API:
quickReply
wiadomość (baza danych wiadomości musi mieć tylko jedną szybką odpowiedź, ale tyle prostych wiadomości tekstowych, ile chcesz). UżywamyfindOneAndUpdate
zamiastreplaceOne
lubfindOneAndReplace
.findOneAndUpdate
) ipopulate
operację zcallback
każdym z nich. Jest to ważne, jeśli nie wiem, czy stosowanieasync/await
,then()
,exec()
lubcallback(err, document)
. Aby uzyskać więcej informacji, zajrzyj do Populate Doc .overwrite
opcją i bez$set
operatora zapytania.upsert
opcją.findOneAndUpdate
i dlapopulate()
.populate
tworzymy niestandardowe dynamiczne odniesienie do modelu z rozszerzeniemgetSenderModel
. Możemy użyć dynamicznego odniesienia Mongoose, ponieważsender.type
forbot
nie ma żadnego modelu Mongoose. Używamy wypełniania w całej bazie danych z opcjamimodel
ipath
opcjami.Spędziłem wiele godzin na rozwiązywaniu drobnych problemów tu i tam i mam nadzieję, że to komuś pomoże! 😃
źródło
Walczyłem z tym przez cały krwawy dzień. Żadne z powyższych rozwiązań nie zadziałało. Jedyne, co zadziałało w moim przypadku na przykładzie takim jak poniżej:
polega na wykonaniu następujących czynności: (Zakładając wypełnienie po pobraniu - ale działa również podczas wywoływania funkcji populate z klasy Model (po której następuje exec))
Innymi słowy, najbardziej zewnętrzna właściwość ścieżki musi zawierać pełną ścieżkę. Wydawało się, że żadna częściowo kompletna ścieżka w połączeniu z właściwościami wypełniania nie działa (a właściwość modelu nie wydaje się być konieczna; ma sens, ponieważ jest uwzględniona w schemacie). Zajęło mi cały dzień, żeby to rozgryźć! Nie wiem, dlaczego inne przykłady nie działają.
(Korzystanie z Mongoose 5.5.32)
źródło
Usuń odniesienie do dokumentów
To zadziałało dla mnie.
źródło