コードの実行順序を理解する必要があります:
-
mongooseは、
{_creator:{$ne:null}}
のデータベースからすべての書籍を取得します 。 Mongoは、書籍コレクション内の参照のみを調べて、返却するドキュメントを決定しています。あなたの本にはまだ著者への参照があり、mongoはAuthorsコレクションに一致する著者がいないことに気付かないため、あなたの本が読み込まれます。 -
mongooseは、返されたすべての結果を入力します。したがって、Authorsコレクションから作成者をロードし、参照を実際のオブジェクトに置き換えます。あなたの本では、一致する著者が見つからないため、
null
を配置します そこの。
そのため、結果リストが作成されます。
Mongoは結合をサポートしていません。したがって、複数のコレクションからのデータを含むクエリを実行することはできません。 Populateは、結果リスト内の参照を実際のデータに置き換える方法にすぎません。入力されたデータをwhere句の一部として使用することはできません。
問題を解決するには、次のいずれかを実行できます。
- 最終結果リストをJSコードでフィルタリングします。例: lodashライブラリの_.filterを使用します。
- 著者を削除するたびに、すべての書籍を更新し、参照を削除してください。 Author-Schemaのフックを使用してこれを行うことができます。
AuthorSchema.post('remove', function(doc) {// update your books here});