MongoDBで指定した配列の任意の組み合わせを含む配列フィールドに一致させる方法
MongoDBで指定した配列の任意の組み合わせを含む配列フィールドに一致させる方法
配列フィールドが、指定した配列の要素のみ(任意の組み合わせ)で構成されているドキュメントを検索したい場合、$nin演算子を$elemMatchおよび$notと組み合わせて使用します。この記事では、実際のコード例を通じてその具体的な使い方を解説します。
サンプルコレクションの作成
まず、概念を理解するために、ドキュメントを含むコレクション「combinationOfArrayDemo」を作成しましょう。insertOne()メソッドを使って、学生名・年齢・好きな技術科目の配列を持つ3件のドキュメントを挿入します。
> db.combinationOfArrayDemo.insertOne({"StudentName":"Larry","StudentAge":21,"StudentFavouriteTechnicalSubject":["C","Java"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7f77cc8d10a061296a3c58")
}
> db.combinationOfArrayDemo.insertOne({"StudentName":"Mike","StudentAge":23,"StudentFavouriteTechnicalSubject":["C++","Java"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7f77dc8d10a061296a3c59")
}
> db.combinationOfArrayDemo.insertOne({"StudentName":"David","StudentAge":22,"StudentFavouriteTechnicalSubject":["Java"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7f77f48d10a061296a3c5a")
}
コレクション内の全ドキュメントを表示する
find()メソッドを使用して、作成したコレクション内のすべてのドキュメントを表示します。
> db.combinationOfArrayDemo.find().pretty();
出力は次のとおりです。
{
"_id" : ObjectId("5c7f77cc8d10a061296a3c58"),
"StudentName" : "Larry",
"StudentAge" : 21,
"StudentFavouriteTechnicalSubject" : [
"C",
"Java"
]
}
{
"_id" : ObjectId("5c7f77dc8d10a061296a3c59"),
"StudentName" : "Mike",
"StudentAge" : 23,
"StudentFavouriteTechnicalSubject" : [
"C++",
"Java"
]
}
{
"_id" : ObjectId("5c7f77f48d10a061296a3c5a"),
"StudentName" : "David",
"StudentAge" : 22,
"StudentFavouriteTechnicalSubject" : [
"Java"
]
}
任意の組み合わせに一致させるクエリを実行する
それでは、指定した配列(ここでは「C++」と「Java」)の任意の組み合わせを含む配列フィールドに一致させるクエリを見てみましょう。
> db.combinationOfArrayDemo.find({StudentFavouriteTechnicalSubject: {$not: {$elemMatch:
{$nin: ['C++', 'Java']}}}}).pretty();
このクエリの仕組みを分解して説明します。
- $nin: ['C++', 'Java'] … 配列内に存在する「C++」「Java」以外の要素を検出します。
- $elemMatch … 配列の各要素に対して上記の条件を適用します。
- $not … 「C++」「Java」以外の要素を1つでも含むドキュメントを除外します。
つまり、このクエリは「C++」または「Java」だけで構成された配列を持つドキュメントのみを返すことになります。
出力は次のとおりです。
{
"_id" : ObjectId("5c7f77dc8d10a061296a3c59"),
"StudentName" : "Mike",
"StudentAge" : 23,
"StudentFavouriteTechnicalSubject" : [
"C++",
"Java"
]
}
{
"_id" : ObjectId("5c7f77f48d10a061296a3c5a"),
"StudentName" : "David",
"StudentAge" : 22,
"StudentFavouriteTechnicalSubject" : [
"Java"
]
}
結果をご覧ください。「C」と「Java」を含むLarryのドキュメントは除外され、「C++」と「Java」を含むMike、および「Java」のみを含むDavidのドキュメントが返されています。これはまさに、指定した配列の任意の組み合わせ(部分集合)に一致するドキュメントを取得する動作です。
-
MongoDBの$slice演算子で特定フィールドの配列をスライスする方法
MongoDBの$slice演算子で特定フィールドの配列をスライスする方法MongoDBで配列をスライス(部分的に取得)するには、$slice 演算子を使用します。$slice は find() メソッドの射影(projection)と組み合わせて使うことで、配列フィールドから必要な要素だけを取り出すことができます。まずは、ドキュメントを含むコレクションを作成してみましょう。> db.demo503.insertOne({_id:1,Name:John,Subject:[MySQL,Java,C]}); { acknowledged : true, insertedId : 1 } &g
-
$elemMatch演算子を使った配列フィールドを持つドキュメントの検索方法【MongoDB】
MongoDBで配列フィールド内の要素に基づいてドキュメントを検索したい場合、$elemMatch 演算子を使用します。$elemMatch を使うことで、配列内の同一の要素に対して複数の条件を同時に適用できるのが大きな特徴です。この記事では、実際にコレクションを作成し、配列フィールドを含むドキュメントを $elemMatch で照合する手順を解説します。1. テスト用コレクションの作成まず、配列フィールド details を持つドキュメントを挿入して、サンプルコレクションを作成しましょう。> db.demo592.insertOne( ... { ... id:1