熱心なmongodbファンとして、私はあなたが高度にリレーショナルなデータのためにリレーショナルデータベースを使用することを提案します-それはそれが構築されているものです。 1つのオブジェクトを取得するために3つ以上のクエリを実行する必要がある場合、mongodbのすべての利点が失われます。
Buuuuuut 、私はコメントが耳に聞こえないことを知っています。あなたの最善の策は、パフォーマンスについてできるだけ意識することです。最初のステップは、フィールドを必要最小限に制限することです。これは、基本的なクエリや任意のでも、良い習慣です。 データベースエンジン-必要なフィールドのみを取得 (例:SELECT * FROM
===悪い...やめてください!)また、無駄のないクエリを実行して、mongooseがデータに対して行う多くの後処理作業を節約することもできます。私はこれをテストしませんでしたが、動作するはずです...
SchemaA.find({}, 'field1 fieldB', { lean: true })
.populate({
name: 'fieldB',
select: 'fieldC',
options: { lean: true }
}).exec(function (err, result) {
// not sure how you are populating "result" in your example, as it should be an array,
// but you said your code works... so I'll let you figure out what goes here.
});
また、必要なことを行うための非常に「モンゴ」な方法は、SchemaCの参照をSchemaAに保存することです。私がそれを行う「mongo」の方法を言うとき、あなたはリレーショナルデータクエリについての長年の考えから脱却しなければなりません。双方向の参照やデータの重複が必要な場合でも、データベースで実行するクエリを減らすために必要なことは何でもしてください。
たとえば、BookスキーマとAuthorスキーマがある場合、Authorsコレクションの完全なプロファイルへの_id参照とともに、著者の姓名をBooksコレクションに保存する可能性があります。そうすれば、1回のクエリで書籍を読み込んでも、著者の名前を表示してから、著者のプロファイルへのハイパーリンクを生成できます:/author/{_id}
。これは「データの非正規化」として知られており、胸焼けを引き起こすことが知られています。人の名前のように、あまり頻繁に変更されないデータで使用しようとしています。名前が変更された場合、複数の場所にあるすべての名前を更新する関数を作成するのは簡単です。