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
演算子を使用して詳しく説明します。