MongoDBでサブドキュメント内の特定の要素を検索する方法|ドット(.)記法の使い方
MongoDBでサブドキュメント内の特定の要素を検索する方法
MongoDBでは、サブドキュメント(ネストされた配列やオブジェクト)の中から特定の要素を取得したい場合、ドット(.)記法を使うのが基本です。この記事では、実際にサンプルコレクションを作成しながら、検索の手順をステップごとにわかりやすく解説します。
ステップ1:サンプルコレクションの作成
まずは、学生情報を格納したドキュメントを含むコレクション「demo81」を作成します。「StudentDetails」という配列フィールドの中に、各学生の名前(StudentName)と科目(StudentSubject)がネストされた構造になっています。
> db.demo81.insertOne({"StudentDetails":[{"StudentName":"Carol","StudentSubject":"Java"},{ "StudentName" : "David", "StudentSubject" : "MongoDB" }]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2bf6ec71bf0181ecc4229d")
}
> db.demo81.insertOne({"StudentDetails":[{"StudentName":"Mike","StudentSubject":"Python"},{ "StudentName" : "David", "StudentSubject" : "C" }]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2bf70471bf0181ecc4229e")
}
> db.demo81.insertOne({"StudentDetails":[{"StudentName":"Jace","StudentSubject":"C++"},{ "StudentName" : "John", "StudentSubject" : "MySQL" }]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2bf72071bf0181ecc4229f")
}ステップ2:登録済みドキュメントの確認
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo81.find();
上記クエリを実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5e2bf6ec71bf0181ecc4229d"), "StudentDetails" : [
{ "StudentName" : "Carol", "StudentSubject" : "Java" },
{"StudentName" : "David", "StudentSubject" : "MongoDB" }
]
}
{
"_id" : ObjectId("5e2bf70471bf0181ecc4229e"), "StudentDetails" : [
{ "StudentName" : "Mike", "StudentSubject" : "Python" },
{ "StudentName" : "David", "StudentSubject" : "C" }
]
}
{
"_id" : ObjectId("5e2bf72071bf0181ecc4229f"), "StudentDetails" : [
{ "StudentName" : "Jace", "StudentSubject" : "C++" },
{ "StudentName" : "John", "StudentSubject" : "MySQL" }
]
}ステップ3:ドット(.)記法でサブドキュメント内を検索する
ここが本題です。サブドキュメント内の要素を検索するには、"親フィールド名.子フィールド名"という形式でパスを指定します。以下は、「StudentDetails.StudentSubject」の値が「MongoDB」と一致するドキュメントを検索するクエリです。
> db.demo81.find({"StudentDetails.StudentSubject":"MongoDB"});実行すると、条件に一致したドキュメントのみが出力されます。この例では、DavidさんがMongoDBを履修している最初のドキュメントが該当します。
{ "_id" : ObjectId("5e2bf6ec71bf0181ecc4229d"), "StudentDetails" : [ { "StudentName" : "Carol", "StudentSubject" : "Java" }, { "StudentName" : "David", "StudentSubject" : "MongoDB" } ] }まとめ
MongoDBで配列などのサブドキュメント内を検索する際は、ドット(.)記法で「親フィールド.子フィールド」のパスを指定するだけでOKです。さらに、"StudentDetails.0.StudentSubject"のように配列のインデックス番号を組み合わせれば、配列内の特定の位置にある要素だけを対象に検索することもできます。ネストされたデータを扱う際は、ぜひ覚えておきたいテクニックです。
-
MongoDBの集約(Aggregation)で特定のフィールド値を持つドキュメントを取得する方法
特定の条件に一致するドキュメントを取得したい場合には、aggregate() メソッドを使用します。ここでは、フィールド「Age」の値が「21」であるドキュメントを取得するケースを例に解説します。 サンプルコレクションの作成 まずは、ドキュメントを含むコレクションを作成しましょう。 > db.demo685.insertOne( ... { ... details: ... [ ... { ... Name:Chris, ... Age:21 ... }, ..
-
MongoDBでドキュメントとサブドキュメントを表示・更新する方法(実例付き)
MongoDBでは、ドキュメントの中にサブドキュメント(ネストされた配列やオブジェクト)を持たせることができます。この記事では、ドキュメントとサブドキュメントを含むコレクションの作成、find()メソッドによる表示、update()メソッドによる更新までを具体例とともに解説します。ドキュメントとサブドキュメントの基本構文ドキュメントとサブドキュメントを挿入する際の基本的な構文は以下のとおりです。db.yourCollectionName.insertOne( {