du måste förstå ordningen för exekvering av din kod:
-
mongoose hämtar alla böcker från databasen där
{_creator:{$ne:null}}
. Mongo tittar bara på referensen i boksamlingen för att avgöra vilka dokument som ska returneras. Din bok har fortfarande en referens till en författare, och mongo kommer inte att märka att det inte finns någon matchande författare i författarens samling, så din bok är laddad. -
mongoose fyller på alla returnerade resultat:så den laddar författarna från författarens samling och ersätter referenserna med de riktiga objekten. För din bok hittar den inte en matchande författare, så den sätter
null
där.
Det är därför du slutar med din resultatlista.
Mongo stöder inte joins - därför kan du inte göra en fråga som innehåller data från mer än en samling. Fylla är bara ett sätt att ersätta referenser i din resultatlista med riktiga data, du kan aldrig använda ifylld data som en del av dina where-klausuler.
För att lösa ditt problem kan du antingen:
- filtrera din slutliga resultatlista i JS-kod, t.ex. med _.filter för lodash-biblioteket.
- uppdatera alla dina böcker och ta bort referensen när du tar bort en författare. Du kan använda krokar på Author-Schema för att göra detta.
AuthorSchema.post('remove', function(doc) {// update your books here});