$elemMatch (配列要素のマッチ)
最終更新:2026-10-09
$elemMatch (配列要素のマッチ)
$elemMatch は、少なくとも 1 つの配列要素が指定されたすべての条件を満たすドキュメントに一致します。`{ scores: { $elemMatch: { $gt: 80, $lt: 90 } } }` は、1 つのスコアが 80 超かつ 90 未満であることを要求します。$elemMatch を使わないと、複数条件の配列クエリは異なる要素にまたがって一致してしまいます。配列クエリの古典的な落とし穴です。
| カテゴリ | 配列 |
|---|---|
| MongoDB バージョン | 1.0+ |
| 例の言語 | mongosh(シェル) |
📝 構文
{ <field>: { $elemMatch: { <condition1>, <condition2>, ... } } }
⚙️ パラメータ
| フィールド | マッチ対象の配列フィールド。 |
|---|---|
| 条件 | 要素がすべて満たす必要があるクエリ条件。 |
戻り値:一致するドキュメントのカーソル
▶ 例
以下のコマンドをローカルの mongosh で実行してください(mongod が起動済みである必要があります):
// $elemMatch: 80 から 90 の間のスコアが 1 つ
// 同じ要素が両方を満たす必要がある
db.students.find({ scores: { $elemMatch: { $gt: 80, $lt: 90 } } })
// 誤り: 異なる要素にまたがって一致してしまう
// db.students.find({ scores: { $gt: 80, $lt: 90 } })
出力:
// 1 つのスコアが 80 超かつ 90 未満の学生を返す
📌 注意事項
- すべての条件が同じ要素に対して成立する必要がある。これが核となる意味論
- ドキュメントの配列にも使える: { $elemMatch: { name: 'A', score: { $gt: 90 } } }
- 条件が 1 つなら直接指定と同じ。複数条件のときは必須になる
🏷️ 関連タグ
💡 関連ケース
📚 関連チュートリアル
❓ よくある質問
Q$elemMatch と素の配列条件の違いは?
A素の { $gt: 80, $lt: 90 } は異なる要素にまたがって一致します。$elemMatch は 1 つの要素が両方を満たすことを強制します。
Q$elemMatch はネストしたドキュメントの配列に使えますか?
Aはい。ネストフィールドを参照します。例: { $elemMatch: { type: 'exam', score: { $gte: 90 } } }。
Q$elemMatch は 1 つのフィールドにしか適用できませんか?
Aはい。1 つの配列フィールドを対象にします。複数の配列フィールドには $elemMatch をそれぞれ書きます。