MongoDBでオブジェクトの配列フィールドの値をクエリする方法
MongoDBでは、配列型のフィールドに格納された値を、通常のフィールドと同じように簡単に検索できます。配列内のいずれかの要素が指定した値と一致すれば、そのドキュメントがクエリ結果として返されます。
サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成しましょう。ここでは「status」という配列フィールドを持つドキュメントを挿入します。
> db.demo295.insertOne({"status":["Active","Inactive"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e4d4ea65d93261e4bc9ea39")
}
> db.demo295.insertOne({"status":["Yes","No"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e4d4eb15d93261e4bc9ea3a")
}
登録済みドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.demo295.find().pretty();
このクエリを実行すると、以下のような出力が得られます。
{
"_id" : ObjectId("5e4d4ea65d93261e4bc9ea39"),
"status" : [
"Active",
"Inactive"
]
}
{
"_id" : ObjectId("5e4d4eb15d93261e4bc9ea3a"),
"status" : [
"Yes",
"No"
]
}
配列フィールドの値をクエリする方法
MongoDBでオブジェクトの配列フィールドの値を検索するには、find()メソッドに対象の値を直接指定します。以下は、「status」配列に「Inactive」が含まれるドキュメントを検索する例です。
> db.demo295.find({status:"Inactive"});
実行すると、次の出力が得られます。
{ "_id" : ObjectId("5e4d4ea65d93261e4bc9ea39"), "status" : [ "Active", "Inactive" ] }
このように、MongoDBでは配列フィールドに対して特別な構文を使わなくても、値を指定するだけで自動的に配列内の要素との一致判定が行われます。これはMongoDBの便利な特徴の一つであり、タグやステータスなど、複数の値を持つデータを扱う際に非常に役立ちます。
-
MongoDBでオブジェクトID(ObjectId)の配列に対して$lookupを実行する方法
MongoDBの$lookupとはオブジェクトID(ObjectId)の配列に対して結合処理を行いたい場合は、$lookupを使用します。$lookupは、同じデータベース内のシャーディングされていないコレクションに対して左外部結合(left outer join)を実行し、「結合」対象のコレクションから条件に合致するドキュメントを取得して処理することができます。通常の$lookupはlocalFieldとforeignFieldによる単純な一致を行いますが、配列に格納された複数のObjectIdをキーに結合するには、letとpipelineを組み合わせた高度な構文が必要です。以下、具体的な手
-
MongoDBでオブジェクト配列から一意な値を取得する方法
MongoDBでオブジェクト配列から重複を除いた一意な値を取得したい場合は、distinct() メソッドを使用します。このメソッドは、指定したフィールドに含まれる値の中から重複を排除したリストを返してくれるため、配列内の特定フィールドだけを抽出したい場合に非常に便利です。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。ここでは demo442 というコレクションに、Information というオブジェクト配列を持つドキュメントを挿入します。> db.demo442.insertOne( ... { ... Information