musíte pochopit pořadí provádění vašeho kódu:
-
mongoose získá všechny knihy z databáze, kde
{_creator:{$ne:null}}
. Mongo se pouze dívá na odkaz uvnitř sbírky knih, aby určil, které dokumenty vrátit. Vaše kniha stále obsahuje odkaz na autora a mongo si nevšimne, že ve sbírce Autoři není žádný odpovídající autor, takže se vaše kniha načte. -
mongoose zaplňuje všechny vrácené výsledky:načítá tedy autory z kolekce Autoři a nahrazuje odkazy skutečnými objekty. Pro vaši knihu nenajde odpovídajícího autora, takže vloží
null
tam.
To je důvod, proč skončíte se svou výsledkovou listinou.
Mongo nepodporuje spojení – proto nemůžete provést dotaz, který obsahuje data z více než jedné kolekce. Vyplnění je jen způsob, jak nahradit odkazy ve výsledkovém seznamu skutečnými daty, nikdy nemůžete použít naplněná data jako součást klauzulí where.
Chcete-li problém vyřešit, můžete:
- filtrujte svůj konečný seznam výsledků v kódu JS, např. s _.filtrem knihovny lodash.
- aktualizujte všechny své knihy a odeberte odkaz, kdykoli smažete autora. K tomu můžete použít háčky na schématu Author-Schema.
AuthorSchema.post('remove', function(doc) {// update your books here});