MongoDBでタグごとにドキュメントを取得する方法|$elemMatch演算子の使い方を解説
MongoDBでは、配列フィールド内の特定の値を持つドキュメントを取得したい場面がよくあります。タグ(Tags)のように配列形式で保存されたデータから、目的のタグが含まれるドキュメントだけを抽出するには、$elemMatch 演算子を使用すると便利です。
この記事では、実際にコレクションを作成しながら、$elemMatch を使ったタグ検索の方法を具体的なクエリと実行結果とともに解説します。
サンプルコレクションの作成
まずは、タグ情報を持つドキュメントを含むコレクションを作成しましょう。以下のコマンドで getDocumentsByTagsDemo コレクションに3件のドキュメントを挿入します。
> db.getDocumentsByTagsDemo.insertOne({"Tags":["Tag-1", "Tag-2", "Tag-3"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9eb4d5d628fa4220163b79")
}
> db.getDocumentsByTagsDemo.insertOne({"Tags":["Tag-2", "Tag-4", "Tag-5"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9eb4d5d628fa4220163b7a")
}
> db.getDocumentsByTagsDemo.insertOne({"Tags":["Tag-6", "Tag-4", "Tag-3"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9eb4d6d628fa4220163b7b")
}登録済みドキュメントの確認
find() メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。pretty() を付けることで、整形された読みやすい形式で出力されます。
> db.getDocumentsByTagsDemo.find().pretty();
実行すると、以下のような結果が得られます。
{
"_id" : ObjectId("5c9eb4d5d628fa4220163b79"),
"Tags" : [
"Tag-1",
"Tag-2",
"Tag-3"
]
}
{
"_id" : ObjectId("5c9eb4d5d628fa4220163b7a"),
"Tags" : [
"Tag-2",
"Tag-4",
"Tag-5"
]
}
{
"_id" : ObjectId("5c9eb4d6d628fa4220163b7b"),
"Tags" : [
"Tag-6",
"Tag-4",
"Tag-3"
]
}$elemMatch を使ってタグごとにドキュメントを取得する
それでは本題の、$elemMatch 演算子を使ったタグ検索です。以下のクエリでは、「Tag-2」というタグを含むドキュメントのみを取得しています。
> db.getDocumentsByTagsDemo.find({Tags: { $elemMatch: { $eq: "Tag-2" } }}).pretty();実行結果は以下の通りです。「Tag-2」を配列内に持つ2件のドキュメントだけが返されていることがわかります。
{
"_id" : ObjectId("5c9eb4d5d628fa4220163b79"),
"Tags" : [
"Tag-1",
"Tag-2",
"Tag-3"
]
}
{
"_id" : ObjectId("5c9eb4d5d628fa4220163b7a"),
"Tags" : [
"Tag-2",
"Tag-4",
"Tag-5"
]
}シンプルな記述で特定のタグを検索する
単一のタグで等価一致を検索するだけであれば、$elemMatch を使わずに、よりシンプルに記述することも可能です。次の例では「Tag-5」を含むドキュメントを直接指定して取得しています。
> db.getDocumentsByTagsDemo.find({Tags: "Tag-5"}).pretty();実行結果は以下の通りです。
{
"_id" : ObjectId("5c9eb4d5d628fa4220163b7a"),
"Tags" : [
"Tag-2",
"Tag-4",
"Tag-5"
]
}$elemMatch のメリットと使いどころ
単純な等価一致であれば { Tags: "Tag-5" } のような簡潔な書き方でも十分ですが、$elemMatch は以下のようなケースで真価を発揮します。
- 複数の条件($gt、$lt など)を組み合わせて、同じ配列要素に対して評価したい場合
- オブジェクトの配列から、特定のフィールド条件を満たす要素を持つドキュメントを検索したい場合
たとえば { $elemMatch: { $gte: 10, $lte: 20 } } のように記述すれば、「10以上20以下の値を1つの要素として持つ」ドキュメントだけを正確に絞り込めます。条件を分けて書くと異なる要素への評価になってしまうため、配列検索では $elemMatch の挙動を理解しておくことが重要です。
まとめ
MongoDBでタグなどの配列フィールドを条件にドキュメントを取得するには、$elemMatch 演算子が有効です。単一タグの等価検索なら find({Tags: "Tag-5"}) のようにシンプルに書けますが、複数条件や複雑な配列検索を行う場合は $elemMatch を活用しましょう。
-
MongoDBで配列フィールドを使ってドキュメントをフィルタリングする方法($elemMatch演算子の使い方)
MongoDBで配列内の要素に基づいてドキュメントをフィルタリングしたい場合、$elemMatch 演算子を使用します。$elemMatch は、指定した条件を満たす要素を少なくとも1つ含む配列フィールドを持つドキュメントを照合するための演算子です。この記事では、実際にコレクションを作成し、$elemMatch を使って配列条件でドキュメントを絞り込む手順を解説します。サンプルコレクションの作成まず、テスト用のコレクションにドキュメントを挿入してみましょう。ここでは、学生の名前と点数(Marks)を持つ details 配列を含むドキュメントを作成します。> db.demo453.ins
-
MongoDBで配列の共通部分(交差)データを取得する方法
MongoDBで配列の共通部分を取得するには?MongoDBで配列同士の共通要素(交差)を求めたい場合、集計パイプラインである aggregate() 内で $setIntersection 演算子を使用します。この演算子は、指定した複数の配列に共通して含まれる要素だけを抽出し、重複を除いた配列として返してくれます。それでは、実際にドキュメントを含むコレクションを作成しながら確認していきましょう。1. サンプルコレクションの作成> db.demo625.insertOne( ... { ... Name: "John", ... M