MongoDBで配列内の一致するドキュメントを取得する方法($elemMatchの使い方)
MongoDBで配列内の一致するドキュメントを取得するには?
MongoDBでは、配列フィールド内に含まれるドキュメントから条件に一致するものを検索したい場合、$elemMatch 演算子を使用します。$elemMatch を使うことで、「配列内の1つの要素が複数の条件をすべて満たす」という厳密なマッチングが可能になります。
この記事では、実際にコレクションを作成し、$elemMatch を使って配列内の一致するドキュメントを取得する手順を解説します。
1. サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成しましょう。以下のように insertOne() メソッドを使って、UserDetails という配列フィールドを持つドキュメントを挿入します。
> db.getMatchingDocumentDemo.insertOne(
{
_id :1,
"UserDetails":[
{
"UserName":"John",
"UserAge":23
}
]
}
);
{ "acknowledged" : true, "insertedId" : 1 }
> db.getMatchingDocumentDemo.insertOne( { _id :2, "UserDetails":[ { "UserName":"Larry", "UserAge":24 } ] } );
{ "acknowledged" : true, "insertedId" : 2 }
これで、_id: 1(Johnさん・23歳)と _id: 2(Larryさん・24歳)の2件のドキュメントが登録されました。
2. 登録された全ドキュメントの確認
find() メソッドと pretty() を組み合わせると、コレクション内のすべてのドキュメントを見やすい形式で表示できます。
> db.getMatchingDocumentDemo.find().pretty();
実行すると、次のような出力が得られます。
{
"_id" : 1,
"UserDetails" : [
{
"UserName" : "John",
"UserAge" : 23
}
]
}
{
"_id" : 2,
"UserDetails" : [
{
"UserName" : "Larry",
"UserAge" : 24
}
]
}
3. $elemMatch を使って配列内の一致するドキュメントを取得する
それでは本題です。MongoDBで配列内の一致するドキュメントを取得するには、クエリの中で $elemMatch を次のように指定します。ここでは「UserAge が 24 のユーザー」を含むドキュメントを検索しています。
> db.getMatchingDocumentDemo.find({UserDetails: {$elemMatch: {UserAge: 24}}});
このクエリを実行すると、以下の出力が得られます。
{ "_id" : 2, "UserDetails" : [ { "UserName" : "Larry", "UserAge" : 24 } ] }
$elemMatch のポイント
- 単一条件の場合: 上記のように
{UserDetails: {$elemMatch: {UserAge: 24}}}と書くことで、配列UserDetails内の要素が条件に一致するドキュメントだけが返されます。 - 複数条件の場合: $elemMatch の真価は複数条件を指定するときに発揮されます。例えば
{$elemMatch: {UserName: "John", UserAge: 23}}とすれば、「同じ1つの要素が名前と年齢の両方の条件を満たす」ドキュメントのみがマッチします。通常のドット表記で{"UserDetails.UserName": "John", "UserDetails.UserAge": 23}と書いた場合と異なり、異なる要素にまたがる誤マッチを防げます。 - 返却されるデータ: 標準の
find()では一致したドキュメント全体が返される点にも注意してください。配列内の一致した要素だけを取り出したい場合は、集計パイプラインの$filterや$projectを併用すると便利です。
まとめ
MongoDBで配列内のドキュメントを条件付きで検索するには、$elemMatch 演算子を使用します。特に、配列要素に対して複数の条件を同時に課したい場合には必須の演算子です。サンプルのように find({配列フィールド: {$elemMatch: {条件}}}) の形式で記述することで、目的のドキュメントを正確に取得できます。
-
MongoDBの集計パイプラインで配列の長さを取得する方法($size演算子の使い方)
MongoDBで配列の要素数を取得するにはMongoDBの集計パイプライン(Aggregation Pipeline)では、$projectステージと組み合わせて$size演算子を使用することで、配列フィールドの長さ(要素数)を簡単に取得できます。この記事では、実際にコレクションを作成し、ドキュメント内の配列の長さを集計クエリで取得する手順を順番に解説します。1. サンプルコレクションの作成まず、insertOne()メソッドを使って、配列を含むドキュメントをコレクションに挿入します。> db.demo382.insertOne( ... { ... Name :
-
MongoDBで配列の共通部分(交差)データを取得する方法
MongoDBで配列の共通部分を取得するには?MongoDBで配列同士の共通要素(交差)を求めたい場合、集計パイプラインである aggregate() 内で $setIntersection 演算子を使用します。この演算子は、指定した複数の配列に共通して含まれる要素だけを抽出し、重複を除いた配列として返してくれます。それでは、実際にドキュメントを含むコレクションを作成しながら確認していきましょう。1. サンプルコレクションの作成> db.demo625.insertOne( ... { ... Name: "John", ... M