MongoDB で複数の条件を使用してクエリを実行する
この記事では、MongoDB で複数のドキュメントを使用して複数の条件でクエリを実行する方法について説明します。 $and および $or 演算子について、それぞれの例を挙げて簡単に説明します。
MongoDB はユーザーにさまざまな論理クエリ演算子を提供します。$or 演算子と $and 演算子は 1つです。 しかし、最初に、この記事の目次を見てみましょう。
$or演算子$or演算子を使用して複数の条件を検索する$and演算子$and演算子を使用して複数の条件を検索する
MongoDB の $or 演算子
要件に応じて、find()、update() などのメソッドでこの演算子を使用できます。
- この演算子は、テキスト クエリ、
GeoSpatialクエリ、および並べ替え操作でも使用できます。 - MongoDB は、
$or式の句を評価するときに、コレクション スキャンを実行します。 または、インデックスが$or式のすべての句をサポートしている場合、MongoDB はインデックス スキャンを実行します。 $or操作をネストすることもできます。
2つ以上の expression の配列に対して論理 OR 演算を実行することにより、OR 演算子は expressions の少なくとも 1つを満たすドキュメントを選択します。 $or 演算子の構文は次のとおりです。
{ $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }
次の例を考えてみましょう。
db.inventory.find( { $or: [ { quantity: { $lt: 51 } }, { price: 20 } ] } )
このクエリでは、quantity フィールドの値が 51 未満、または price フィールドの値が 20 未満の在庫コレクション内のすべてのドキュメントが返されます。
最初に、MongoDB の or 演算子の動作について説明しましょう。
$or 演算子の句とインデックス
$or 式のすべての句を評価するとき、MongoDB はコレクション スキャンまたはインデックス スキャンを実行します。 インデックスがすべての句をサポートしている場合、MongoDB はインデックス スキャンを実行します。
その結果、MongoDB がステートメントを分析するには、$or 式のすべての句がインデックスでサポートされている必要があります。 そうでない場合、MongoDB はコレクション スキャンを実行します。
$or クエリでインデックスを使用する場合、$or クエリの各句はそのインデックスを利用できます。 以下の例を見てください。
db.inventory.find( { $or: [ { quantity: { $lt: 51 } }, { price: 20 } ] } )
複合インデックスではなく、quantity 用に 1つのインデックスを作成し、price 用に別のインデックスを作成して、このクエリを処理します。
db.inventory.createIndex( { quantity: 1 } )
db.inventory.createIndex( { price: 1 } )
$or 句を有効にするために、MongoDB は geoHaystack インデックス以外の任意のインデックスを使用できます。
text クエリと $or 演算子
$or に $text クエリが含まれる場合、インデックスは $or 配列のすべての句をサポートする必要があります。 その結果、$text クエリはインデックスを使用する必要があり、$or クエリはそのすべての句がサポートされている場合にのみインデックスを使用できます。
$text クエリがインデックスを使用しない場合、クエリはエラーを返します。
GeoSpatial クエリと $or 演算子
$or は、near 句 ($nearSphere と $near を含む) を除いて、geographic 句を許可します。 $or に別の句を持つ相対句を含めることはできません。
ソート操作と $or 演算子
sort() で $or クエリを実行する場合、MongoDB は $or 句をサポートするインデックスを利用できるようになりました。 以前のバージョンの MongoDB では、インデックスは使用されませんでした。
$or VS $in
$or 演算子の代わりに $in 演算子を expressions と共に使用します。これは、同じフィールドの値に対する等価テストです。
たとえば、$in 演算子を使用して、inventory コレクションで quantity フィールドの値が 40 または 1000 のすべてのドキュメントを選択します。
db.inventory.find ( { quantity: { $in: [40, 1000] } } )
$or 演算子を使用して複数の条件を見つける
MongoDB の or 演算子は、指定されたフレーズの少なくとも 1つに一致するドキュメントのみを選択または取得するために使用されます。
- 必要に応じて、この演算子を
find()、update()などのメソッドで使用することもできます。 - この演算子は、テキスト クエリおよび並べ替え操作でも使用できます。
$or操作をネストすることもできます。
$or 演算子の働きを理解するための例を見てみましょう。
例:
次のドキュメントを含むコレクションを作成しましょう。
db={
"students": [
{
id: 1,
name: "Ali",
Age: 24,
language: "JavaScript",
status: "inactive",
score: 82
},
{
id: 2,
name: "Haris",
Age: 35,
language: "Python",
status: "inactive",
score: 87
},
{
id: 3,
team: "Hamza",
Age: 27,
status: "active",
language: "Python",
score: 84
}
]
}
find() メソッドを使用して、コレクションからすべてのドキュメントを表示します。
db.students.find();
以下は、$or 演算子を使用した MongoDB クエリです。
db.students.find({
$or: [
{
Age: {
$lte: 24
}
},
{
score: {
$lt: 80
}
},
{
status: "Inactive"
}
]
})
これにより、次の出力が生成されます。

MongoDB の $and 演算子
$and は、1つ以上の式 (expression1>、expression2> など) の配列に対して論理的な AND 演算を実行し、すべての式を満たすドキュメントを選択します。
行動:
$and は、クエリ エンジンがクエリを改善するのを支援するために、次のように間違いを処理します。
$andに与えられた式が単独で評価されるとエラーになる場合、その式を含む$andはエラーになる可能性がありますが、これは保証されていません。$andに指定された最初の式の後に指定された式は、最初の式がfalseと評価された場合でも、エラーを引き起こす可能性があります。
構文:
and 演算子を使用する場合の構文は次のとおりです。
{ $and: [{ <expression1> },{ <expression2> }, ... ,{ <expressionN> }] }
たとえば、次のクエリは、$x が 0 の場合、常にエラーになります。
db.example.find( {
$expr: { $eq: [ { $divide: [ 1, "$x" ] }, 3 ] }
} )
$and に指定された複数の式を含む次のクエリは、$x が 0 であるドキュメントがある場合、エラーを生成する可能性があります。
db.example.find( {
$and: [
{ x: { $ne: 0 } },
{ $expr: { $eq: [ { $divide: [ 1, "$x" ] }, 3 ] } }
]
} )
$and 演算子を使用して複数の条件を見つける
MongoDB で $and 演算子を使用して、いくつかの基準を適用できます。 まず、$and 操作を使用して、すべての条件句を満たすすべての論文を選択します。
- この演算子は、必要に応じて、
find()、update()などのメソッドで使用できます。 - この演算子は、テキスト クエリおよび並べ替え操作でも使用できます。
それでは、例を使ってそれを理解しましょう。
次のレコードが students コレクションに挿入されます。
db={
"students": [
{
id: 1,
name: "Ali",
Age: 24,
language: "JavaScript",
status: "inactive",
score: 82
},
{
id: 2,
name: "Haris",
Age: 35,
language: "Python",
status: "inactive",
score: 87
},
{
id: 3,
team: "Hamza",
Age: 27,
status: "active",
language: "Python",
score: 84
}
]
}
ここで、$and 演算子を使用して複数の条件を適用し、ドキュメントを検索します。
db.students.find({
$and: [
{
"language": "Python"
},
{
"Age": 35
}
]
})
ここでは、language が Python で、Age が 35 であるドキュメントを見つけるために $and 操作が適用されます。
このスクリーンショットから、MongoDB での上記のコードの動作を確認してください。

指定された条件に従って、結果が正常に取得されました。 次に、$and 演算子を使用して、条件に従ってドキュメントを取得できます。
この記事では、MongoDB で複数のドキュメントを使用して複数の条件でクエリを実行する方法について、$and および $or 演算子を使用して詳しく説明します。