【MongoDB】ネストされた文字列の配列を取得するクエリの書き方
MongoDBでネストされた文字列の配列を取得する方法
MongoDBで、ネストされた配列の中にある文字列を検索・取得したい場合は、find()メソッドの中でドット表記(dot notation)を使用します。ドット表記とは「親フィールド.子フィールド」のようにピリオドでフィールドをつなぎ、階層化されたデータへアクセスするための記法です。
まずは、動作を確認するためのサンプルコレクションとドキュメントを作成しましょう。
> db.demo89.insertOne(
... { id: 101, Details: [ { Name: "Chris", Marks: 45 }, { Name: "David", Marks: 55, Subjects : ["MySQL", "MongoDB", "Java", "C"] } ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2c163b79799acab037af51")
}
> db.demo89.insertOne(
... { id: 102, Details: [ { Name: "Mike", Marks: 48 }, { Name: "Bob", Marks: 98, Subjects : ["C++", "MySQL"] } ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2c163c79799acab037af52")
}
このサンプルでは、Detailsフィールドの中に氏名や点数を格納したオブジェクトを配置し、さらにその中に科目名を保持するSubjectsという文字列配列を持つ構造になっています。このように配列が入れ子になったドキュメントを2件挿入しました。
コレクション内のすべてのドキュメントを表示する
find()メソッドを引数なしで実行すると、コレクション内のすべてのドキュメントを確認できます。
> db.demo89.find();
このクエリを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e2c163b79799acab037af51"), "id" : 101, "Details" : [ { "Name" : "Chris", "Marks" : 45 }, { "Name" : "David", "Marks" : 55, "Subjects" : [ "MySQL", "MongoDB", "Java", "C" ] } ] }
{ "_id" : ObjectId("5e2c163c79799acab037af52"), "id" : 102, "Details" : [ { "Name" : "Mike", "Marks" : 48 }, { "Name" : "Bob", "Marks" : 98, "Subjects" : [ "C++", "MySQL" ] } ] }
ネストされた文字列配列を条件に検索するクエリ
それでは本題です。ネストされた配列内の文字列を条件としてドキュメントを取得するには、"Details.Subjects"のようにドットでパスを指定したクエリを使用します。
> db.demo89.find({ "Details.Subjects": "MongoDB"});
このクエリを実行すると、次の出力が得られます。
{ "_id" : ObjectId("5e2c163b79799acab037af51"), "id" : 101, "Details" : [ { "Name" : "Chris", "Marks" : 45 }, { "Name" : "David", "Marks" : 55, "Subjects" : [ "MySQL", "MongoDB", "Java", "C" ] } ] }
出力結果を見ると、id: 101のドキュメントのみが返されています。Subjects配列の中に"MongoDB"という値が含まれているのは、このドキュメントだけだからです。
ポイントは、配列のどの位置(インデックス)に目的の文字列が存在していても、MongoDBが自動的に各要素を走査してマッチングを行ってくれる点です。つまり、ドット表記を使えば深くネストされた配列の要素でも、シンプルな条件式だけで直感的に検索できるのがMongoDBの大きな魅力といえます。
-
MongoDBで配列要素の平均値を取得するクエリの書き方
MongoDBで配列内の数値の平均を求める方法MongoDBでは、配列に格納された複数の数値から平均値を算出したいケースがよくあります。例えば、1つのドキュメントの中に複数の点数(Marks)が配列として保存されている場合、その平均点を取得したいことがあります。このような場合、集計パイプライン(aggregation)と$avg演算子を組み合わせることで、簡単に平均値を求めることができます。$avgは、指定したフィールド(配列の場合はその全要素)の数値の平均を自動的に計算してくれる便利な演算子です。以下、具体的な手順を見ていきましょう。1. コレクションを作成し、ドキュメントを挿入するまず、i
-
MongoDBでネストされたドキュメントを更新する方法|位置演算子$を使った配列要素の更新手順
MongoDBでは、ドキュメント内の配列に格納されたネストされた(入れ子の)ドキュメントも、位置演算子「$」を使うことで効率的に更新できます。この記事では、実際のコード例を通じて、配列内の特定のサブドキュメントを更新する手順をわかりやすく解説します。 1. サンプルコレクションの作成 まず、insertOne()メソッドを使用して、ネストされたドキュメントを含むコレクションを作成します。ここでは「Information」というフィールドに、複数のサブドキュメントを持つ配列を格納しています。 > db.demo595.insertOne( { Information: [ { _i