MongoDBの$in演算子を使って複数の配列要素でドキュメントを検索する方法
MongoDBでは、$in演算子を使用することで、配列フィールド内の複数の値を条件としてドキュメントを検索できます。この記事では、実際のコード例を通じて、$in演算子による複数配列要素検索の方法をわかりやすく解説します。
サンプルコレクションの作成
まず、動作を確認するために、学生情報を格納するコレクションを作成し、ドキュメントを挿入します。
以下のクエリで、コレクションを作成してドキュメントを挿入します。
> db.findByMultipleArrayDemo.insertOne({"StudentFirstName":"John","StudentLastName":"Smith",
"StudentCoreSubject":["Compiler","Operating System","Computer Networks"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7ef07b559dd2396bcfbfc4")
}
> db.findByMultipleArrayDemo.insertOne({"StudentFirstName":"Carol","StudentLastName":"Taylor",
"StudentCoreSubject":["MongoDB","MySQL","SQL Server"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7ef09d559dd2396bcfbfc5")
}
> db.findByMultipleArrayDemo.insertOne({"StudentFirstName":"Bob","StudentLastName":"Taylor",
"StudentCoreSubject":["MongoDB","MySQL","SQL Server"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7ef0c7559dd2396bcfbfc6")
}
> db.findByMultipleArrayDemo.insertOne({"StudentFirstName":"David","StudentLastName":"Johnson",
"StudentCoreSubject":["Compiler","Operating System","Computer Networks"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7ef0f2559dd2396bcfbfc7")
}このコレクションには、4人の学生データが登録されています。「John」と「David」は「Compiler」「Operating System」「Computer Networks」を履修しており、「Carol」と「Bob」は「MongoDB」「MySQL」「SQL Server」を履修しています。
登録済みドキュメントの確認
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.findByMultipleArrayDemo.find().pretty();
実行結果は以下のとおりです。
{
"_id" : ObjectId("5c7ef07b559dd2396bcfbfc4"),
"StudentFirstName" : "John",
"StudentLastName" : "Smith",
"StudentCoreSubject" : [
"Compiler",
"Operating System",
"Computer Networks"
]
}
{
"_id" : ObjectId("5c7ef09d559dd2396bcfbfc5"),
"StudentFirstName" : "Carol",
"StudentLastName" : "Taylor",
"StudentCoreSubject" : [
"MongoDB",
"MySQL",
"SQL Server"
]
}
{
"_id" : ObjectId("5c7ef0c7559dd2396bcfbfc6"),
"StudentFirstName" : "Bob",
"StudentLastName" : "Taylor",
"StudentCoreSubject" : [
"MongoDB",
"MySQL",
"SQL Server"
]
}
{
"_id" : ObjectId("5c7ef0f2559dd2396bcfbfc7"),
"StudentFirstName" : "David",
"StudentLastName" : "Johnson",
"StudentCoreSubject" : [
"Compiler",
"Operating System",
"Computer Networks"
]
}$in演算子で複数の配列要素を検索する
それでは、本題である$in演算子を使った検索を行いましょう。次のクエリでは、配列「StudentCoreSubject」の中に「Compiler」または「Computer Networks」のいずれかが含まれるドキュメントを取得します。
> db.findByMultipleArrayDemo.find({ StudentCoreSubject: { $in: ["Compiler", "Computer Networks"] }}).pretty();実行結果は以下のとおりです。
{
"_id" : ObjectId("5c7ef07b559dd2396bcfbfc4"),
"StudentFirstName" : "John",
"StudentLastName" : "Smith",
"StudentCoreSubject" : [
"Compiler",
"Operating System",
"Computer Networks"
]
}
{
"_id" : ObjectId("5c7ef0f2559dd2396bcfbfc7"),
"StudentFirstName" : "David",
"StudentLastName" : "Johnson",
"StudentCoreSubject" : [
"Compiler",
"Operating System",
"Computer Networks"
]
}結果のポイント
上記の出力から分かるように、指定した2つの値(「Compiler」と「Computer Networks」)のうち、どちらか一方でも配列内に含まれていれば、そのドキュメントが検索結果として返されます。そのため、「John」と「David」の2件だけが該当し、「MongoDB」系の科目を履修している「Carol」と「Bob」は除外されました。
$in演算子はOR条件のような働きをするため、配列フィールドに対して「複数の候補値のいずれかに一致するドキュメントを取得したい」というケースで非常に便利です。なお、配列内に指定した値がすべて含まれるドキュメントを検索したい場合は、代わりに$all演算子を使用します。
-
MongoDBで$in演算子を使うと複数の個別検索より高速になるのか?
MongoDBにおける$in演算子と複数単一検索のパフォーマンス比較結論から言うと、$in演算子を使用した方が高速です。複数のクエリを個別に実行する場合、それぞれのクエリごとにデータベースへの接続・解析・実行というオーバーヘッドが発生します。一方、$inを使えば1回のクエリで複数の値をまとめて検索できるため、パフォーマンスが大幅に向上します。ここでは、実際の例を通して$in演算子の使い方を確認してみましょう。まず、ドキュメントを含むコレクションを作成します。> db.demo653.insertOne({subject:MySQL}); { acknowledged : true
-
MongoDBで複数のドキュメントをアトミックに一括更新する方法
MongoDBでは、update()メソッドに更新演算子の$setを組み合わせることで、条件に一致した複数のドキュメントをまとめてアトミックに更新できます。本記事では、サンプルコレクションを使いながら、その具体的な手順を解説します。 1. サンプルコレクションの作成 まず、insertOne()メソッドを使ってドキュメントを含むコレクションを作成します。 > db.demo699.insertOne({Name:Chris Brown}); { acknowledged : true, insertedId : ObjectId(5ea6e370551299a9f98c93a