【MongoDB】ドット表記でサブ配列からドキュメントを検索する方法
MongoDBでサブ配列からドキュメントを検索する方法
MongoDBでは、ドット(.)表記を使うことで、ネストされたオブジェクトやサブ配列の内部にあるフィールドを条件として、ドキュメントを簡単に検索できます。本記事では、従業員情報を格納したサブ配列を持つコレクションを例に、具体的な検索手順をサンプルコード付きで解説します。
1. サンプルコレクションの作成
まず、insertOne()メソッドを使用して、ドキュメントをコレクションに挿入します。ここでは「EmployeeDetails」オブジェクトの中に「EmployeeAppraisalTime」という配列を用意し、各要素に役職(EmployeeDesignation)と給与(Salary)を格納しています。
> db.findDocumentDemo.insertOne(
... {
... "EmployeeDetails" :
... {
... "EmployeeAppraisalTime":
... [
... {"EmployeeDesignation": "Developer", "Salary": 45000},
... {"EmployeeDesignation": "Tester", "Salary": 30000},
... {"EmployeeDesignation": "HR", "Salary": 22000},
... {"EmployeeDesignation": "Accountant", "Salary": 18000}
... ]
... }
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd2c0f7b64f4b851c3a13a8")
}
> db.findDocumentDemo.insertOne(
... {
... "EmployeeDetails" :
... {
... "EmployeeAppraisalTime":
... [
... {"EmployeeDesignation": "Developer", "Salary": 105000},
... {"EmployeeDesignation": "Tester", "Salary": 45000},
... {"EmployeeDesignation": "HR", "Salary": 34000},
... {"EmployeeDesignation": "Accountant", "Salary": 24000}
... ]
... }
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd2c1d5b64f4b851c3a13a9")
}
2. 登録されたドキュメントの確認
find()メソッドにpretty()を組み合わせると、コレクション内のすべてのドキュメントを整形された見やすい形式で表示できます。
> db.findDocumentDemo.find().pretty();
上記のクエリを実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5cd2c0f7b64f4b851c3a13a8"),
"EmployeeDetails" : {
"EmployeeAppraisalTime" : [
{
"EmployeeDesignation" : "Developer",
"Salary" : 45000
},
{
"EmployeeDesignation" : "Tester",
"Salary" : 30000
},
{
"EmployeeDesignation" : "HR",
"Salary" : 22000
},
{
"EmployeeDesignation" : "Accountant",
"Salary" : 18000
}
]
}
}
{
"_id" : ObjectId("5cd2c1d5b64f4b851c3a13a9"),
"EmployeeDetails" : {
"EmployeeAppraisalTime" : [
{
"EmployeeDesignation" : "Developer",
"Salary" : 105000
},
{
"EmployeeDesignation" : "Tester",
"Salary" : 45000
},
{
"EmployeeDesignation" : "HR",
"Salary" : 34000
},
{
"EmployeeDesignation" : "Accountant",
"Salary" : 24000
}
]
}
}
3. ドット表記と$in演算子でサブ配列を検索する
サブ配列内のフィールドを検索するには、「親フィールド.配列名.子フィールド」という形式でパスを指定します。さらに$in演算子を併用すれば、複数の候補値のいずれかに一致するドキュメントを一度に取得できます。
> db.findDocumentDemo.find({ 'EmployeeDetails.EmployeeAppraisalTime.EmployeeDesignation': 'Developer', 'EmployeeDetails.EmployeeAppraisalTime.Salary': { '$in': [45000,105000] } } );
このクエリは、「EmployeeDesignationがDeveloperであり、かつSalaryが45000または105000のいずれかに一致する要素を含むドキュメント」をすべて返します。実行結果は以下の通りです。
{ "_id" : ObjectId("5cd2c0f7b64f4b851c3a13a8"), "EmployeeDetails" : { "EmployeeAppraisalTime" : [ { "EmployeeDesignation" : "Developer", "Salary" : 45000 }, { "EmployeeDesignation" : "Tester", "Salary" : 30000 }, { "EmployeeDesignation" : "HR", "Salary" : 22000 }, { "EmployeeDesignation" : "Accountant", "Salary" : 18000 } ] } }
{ "_id" : ObjectId("5cd2c1d5b64f4b851c3a13a9"), "EmployeeDetails" : { "EmployeeAppraisalTime" : [ { "EmployeeDesignation" : "Developer", "Salary" : 105000 }, { "EmployeeDesignation" : "Tester", "Salary" : 45000 }, { "EmployeeDesignation" : "HR", "Salary" : 34000 }, { "EmployeeDesignation" : "Accountant", "Salary" : 24000 } ] } }
補足:$elemMatchとの違いに注意
上記のクエリでは、複数の条件が別々の配列要素にまたがって一致した場合でも、そのドキュメントはヒットします。もし「同一の配列要素内ですべての条件を満たす」ことを厳密に要求したい場合は、$elemMatch演算子を使用すると、より正確な検索が可能になります。用途に応じて使い分けることで、意図した通りのデータ取得ができるようになります。
-
MongoDBで同じ配列要素に一致するドキュメントを検索する方法
MongoDBで$all演算子を使って配列要素の一致するドキュメントを取得するMongoDBで、特定の配列要素と同じ内容を持つドキュメントを検索するには、find()メソッドの中で$all演算子を使用します。$all演算子は、フィールドの値が配列であり、その配列が指定されたすべての要素を含んでいるドキュメントを選択します。さらに$size演算子を組み合わせることで、要素数まで一致するドキュメントを正確に絞り込むことが可能です。それでは、まずドキュメントを含むコレクションを作成しましょう。> db.demo543.insertOne({id:101, subject:["MySQ
-
MongoDBの埋め込みドキュメントから特定の要素を抽出する方法($unwind・$match・$projectの活用)
MongoDBでは、配列形式の埋め込みドキュメントから特定の条件に合う要素だけを取り出したい場面がよくあります。そのような場合は、集計(Aggregation)パイプラインで $unwind、$match、$project を組み合わせることで、目的のデータを効率的に抽出できます。コレクションの作成とドキュメントの挿入まず、insertOne() メソッドを使って、学生情報を配列として持つコレクションを作成します。> db.demo744.insertOne( ... { ... studentInformation: ... [ ...