MongoDB 4でネストされたクエリを作成し、特定のドキュメントを取得する方法
MongoDBでは、ドキュメントの中にさらにオブジェクトや配列が入れ子になった構造を扱うことがよくあります。このようなネストされたデータから特定のドキュメントを取得するには、ドット表記(ドット・ノーテーション)を使ったクエリが便利です。ここでは、MongoDB 4でネストされたフィールドを条件に検索を行い、目的のドキュメントをフェッチする手順を解説します。
1. コレクションの作成とドキュメントの挿入
まず、ネストされた構造を持つドキュメントを含むコレクションを作成します。insertOne()メソッドを使って、サンプルデータを挿入していきます。
> db.demo492.insertOne({
... "ProductDetails" :
... {
... "StockDetails" : [
... { "ProductName" : "Product-1" },
... { "ProductName" : "Product-2" },
... { "ProductName" : "Product-3" }
... ]
... }
... });
{
"acknowledged" : true,
"insertedId" : ObjectId("5e849db8b0f3fa88e22790c2")
}続けて、もう1件のドキュメントも挿入します。
> db.demo492.insertOne({
... "ProductDetails" :
... {
... "StockDetails" : [
... { "ProductName" : "Product-4" },
... { "ProductName" : "Product-5" },
... { "ProductName" : "Product-6" }
... ]
... }
... });
{
"acknowledged" : true,
"insertedId" : ObjectId("5e849dceb0f3fa88e22790c3")
}これで、「ProductDetails」オブジェクトの中に「StockDetails」という配列があり、その各要素に「ProductName」が格納された、2階層以上のネスト構造を持つコレクションが完成しました。
2. コレクション内の全ドキュメントを表示する
find()メソッドを使うと、コレクション内のすべてのドキュメントを確認できます。
> db.demo492.find();
実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e849db8b0f3fa88e22790c2"), "ProductDetails" : { "StockDetails" : [ {
"ProductName" : "Product-1" }, { "ProductName" : "Product-2" }, { "ProductName" : "Product-3" } ] } }
{ "_id" : ObjectId("5e849dceb0f3fa88e22790c3"), "StockDetails" : [ {
"ProductName" : "Product-4" }, { "ProductName" : "Product-5" }, { "ProductName" : "Product-6" } ] } }3. ドット表記によるネストされたクエリで特定のドキュメントを取得
ネストされたフィールドを条件に検索するには、「親フィールド.子フィールド」のようにピリオドでつなげたドット表記を使用します。次の例では、「StockDetails」配列内の「ProductName」が「Product-1」であるドキュメントを取得しています。
> db.demo492.find({ "ProductDetails.StockDetails.ProductName":"Product-1"});実行結果は以下のとおりです。
{ "_id" : ObjectId("5e849db8b0f3fa88e22790c2"), "ProductDetails" : { "StockDetails" : [ {
"ProductName" : "Product-1" }, { "ProductName" : "Product-2" }, { "ProductName" : "Product-3" } ] } }このように、配列内の要素に一致する値が1つでも存在すれば、その配列を含むドキュメント全体が取得されます。条件に合致したのは最初のドキュメントだけなので、出力にはObjectId「5e849db8b0f3fa88e22790c2」を持つ1件のみが表示されています。
ポイントまとめ
- ネストされたオブジェクトや配列内のフィールドは、「ProductDetails.StockDetails.ProductName」のようにドットで連結して指定できる。
- 配列内の要素に対する条件は、いずれかの要素が一致すればヒットする。
- find()メソッドにクエリ条件を渡すことで、特定のドキュメントだけを効率よくフェッチできる。
-
MongoDBドキュメントから特定の値をフィルタリングする方法
MongoDBドキュメントから特定の値をフィルタリングする方法MongoDBでドキュメント内の配列から特定の値を抽出したい場合は、集計パイプラインで $filter を使用します。この記事では、実際にコレクションを作成し、特定の条件に一致する要素だけをフィルタリングする手順を、サンプルコードとともに解説します。1. サンプルコレクションの作成まず、insertOne() メソッドを使って、配列フィールドを含むドキュメントを持つコレクションを作成します。 db.demo751.insertOne( ... { ... _id: 101, ... details: [
-
MongoDBで配列をクエリして特定の値を取得する方法
配列から特定の値を取得するには、aggregate()メソッドと$projectステージを組み合わせて使用します。まずは、ドキュメントを含むコレクションを作成してみましょう。 > db.demo761.insertOne( ... { ... "details": [ ... { ... "