você precisa entender a ordem de execução do seu código:
-
mangusto obtém todos os livros do banco de dados onde{_creator:{$ne:null}}
. Mongo está apenas olhando para a referência dentro da coleção de livros para determinar quais documentos devem ser devolvidos. Seu livro ainda tem uma referência a um autor, e o mongo não notará que não há nenhum autor correspondente na coleção Authors, então seu livro é carregado.
-
mongoose está preenchendo todos os resultados retornados:então ele está carregando os autores da coleção Authors e substitui as referências pelos objetos reais. Para o seu livro, ele não encontra um autor correspondente, então ele coloca onull
lá.
É por isso que você acaba com sua lista de resultados.
O Mongo não suporta junções - portanto, você não pode fazer uma consulta que inclua dados de mais de uma coleção. Populate é apenas uma maneira de substituir referências em sua lista de resultados por dados reais, você nunca pode usar dados preenchidos como parte de suas cláusulas where.
Para resolver seu problema, você pode:
- filtre sua lista de resultados final em código JS, por exemplo com _.filter da biblioteca lodash.
- atualize todos os seus livros e remova a referência sempre que excluir um autor. Você pode usar ganchos no Author-Schema para fazer isso.
AuthorSchema.post('remove', function(doc) {// update your books here});