MongoDBの複数のテーブルを使った関連クエリステートメントの書き方は?
MongoDBは、従来の多次テーブル結合クエリー文をサポートしない非リレーショナルデータベースです。その代わり、埋め込みドキュメントや参照ドキュメントを使用して、多次結合クエリーを処理します。
- ドキュメントのネスト化:あるコレクション内のドキュメントを、別のコレクション内のドキュメント内に埋め込むこと。これは、1対1または1対多の関係があるデータに利用されます。たとえば、1つの注文ドキュメントには複数の商品ドキュメントを埋め込むことができます。
- ドキュメントの参照:1つのドキュメント内で別のドキュメント(コレクション)を参照します。この方法は、多対一または多対多リレーションシップが存在する場合に適しています。たとえば、1つのユーザー文書が複数の注文文書を参照できます。
一般的な多様なテーブルの結合に関する問い合わせの構文の例は以下のとおりです。
- ドキュメント内検索:注文情報に関連する商品情報を含む注文(orders)と商品(products)という二つのコレクションがあるとします。
注文の商品情報を検索する:
db.orders.findOne({ _id: ObjectId('order_id') }, { products: { $elemMatch: { _id: ObjectId('product_id') } } })
- ドキュメントを参照引用:ユーザーと注文の2つのセットがあるとします。注文にはユーザー情報が参照されています。
あるユーザーのすべての注文を検索する:
db.orders.find({ user_id: ObjectId('user_id') })
特定の注文に関連付けられたユーザー情報を検索する。
db.orders.aggregate([
{ $match: { _id: ObjectId('order_id') } },
{
$lookup: {
from: 'users',
localField: 'user_id',
foreignField: '_id',
as: 'user'
}
}
])
上記はシンプルな多テーブル結合クエリの一例ですが、実際のクエリステートメントは状況に応じて異なります。実際には、データモデルの設計とクエリの要件に応じて、埋め込みドキュメントまたは参照ドキュメントの方法を使用して多テーブル結合クエリを処理できます。