devi capire l'ordine di esecuzione del tuo codice:
-
mongoose ottiene tutti i libri dal database in cui
{_creator:{$ne:null}}
. Mongo sta solo guardando il riferimento all'interno della collezione di libri per determinare quali documenti restituire. Il tuo libro ha ancora un riferimento a un autore e mongo non noterà che non c'è nessun autore corrispondente nella raccolta Autori, quindi il tuo libro è caricato. -
mongoose sta popolando tutti i risultati restituiti:quindi carica gli autori dalla raccolta Autori e sostituisce i riferimenti con gli oggetti reali. Per il tuo libro non trova un autore corrispondente, quindi inserisce
null
là.
Ecco perché finisci con la tua lista dei risultati.
Mongo non supporta i join, quindi non puoi eseguire una query che includa dati da più di una raccolta. Popola è solo un modo per sostituire i riferimenti nell'elenco dei risultati con dati reali, non puoi mai utilizzare i dati popolati come parte delle clausole where.
Per risolvere il tuo problema puoi:
- filtra l'elenco dei risultati finali nel codice JS, ad es. con _.filtro della libreria lodash.
- aggiorna tutti i tuoi libri e rimuovi il riferimento ogni volta che elimini un autore. Puoi usare gli hook sullo schema dell'autore per farlo.
AuthorSchema.post('remove', function(doc) {// update your books here});