je moet de volgorde van uitvoering van je code begrijpen:
-
mongoose haalt alle boeken uit de database waar
{_creator:{$ne:null}}
. Mongo kijkt alleen naar de referentie in de boekencollectie om te bepalen welke documenten moeten worden geretourneerd. Je boek heeft nog steeds een verwijzing naar een auteur en mongo merkt niet dat er geen overeenkomende auteur in de verzameling Auteurs is, dus je boek is geladen. -
mongoose vult alle geretourneerde resultaten:het laadt dus de auteurs uit de auteurscollectie en vervangt de verwijzingen door de echte objecten. Voor uw boek vindt het geen overeenkomende auteur, dus het zet de
null
daar.
Daarom eindig je met je resultatenlijst.
Mongo ondersteunt geen joins - daarom kunt u geen query uitvoeren die gegevens uit meer dan één verzameling bevat. Bevolken is slechts een manier om referenties in uw resultatenlijst te vervangen door echte gegevens, u kunt nooit ingevulde gegevens gebruiken als onderdeel van uw waar-clausules.
Om uw probleem op te lossen kunt u:
- filter uw uiteindelijke resultatenlijst in JS-code, b.v. met _.filter van de lodash-bibliotheek.
- werk al je boeken bij en verwijder de referentie wanneer je een auteur verwijdert. U kunt hiervoor hooks op het Author-Schema gebruiken.
AuthorSchema.post('remove', function(doc) {// update your books here});