MongoDB論理オペレータ$or,$and,$not,$nor

14439 ワード

$orは1つの論理orオペレータが1つのデータまたは複数の式で動作し、少なくとも1つの条件を満たす式を選択する必要があります.$orには少なくとも以下の式があります.
{ $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }
は、以下の例を考慮する.
db.inventory.find( { $or: [ { quantity: { $lt: 20 } }, { price: 10 } ] } )
の例では、セットinventory内のすべてのフィールドquantityが20未満またはpriceが10に等しいすべてのドキュメントがクエリーされます.
$or条件評価条件を使用すると、MongoDBはドキュメント全体をスキャンします.すべての条件がインデックスをサポートする場合、MongoDBはインデックススキャンを行います.そのため、MongoDBはインデックスを使用して$or式を実行します.$orのすべての式はインデックスをサポートする必要があります.そうしないと、MongoDBはセット全体をスキャンします.
$orクエリを使用してインデックスを使用する場合、各$orの条件式は、次のクエリを考慮して独自のインデックスを使用できます.
db.inventory.find( { $or: [ { quantity: { $lt: 20 } }, { price: 10 } ] } )
は、上記のクエリをサポートします.インデックスを作成する必要はありません.フィールドquantityにインデックスを作成し、priceにインデックスを作成します.
db.inventory.createIndex( { quantity: 1 } )
db.inventory.createIndex( { price: 1 } )
$orおよびsort()操作
$orを使用してsort()クエリーを実行する場合、MongoDBは$orクエリー条件をサポートするインデックスを使用できます.以前のバージョンではインデックスはサポートされていませんでした.
$orと$in
$or操作を使用してフィールドの値が値に等しいかどうかを比較する場合は、$inを使用して$or操作を置き換えることができます.たとえば、クエリセットinventoryのフィールドquantityの値が20または50に等しいすべてのドキュメントについて、$in操作を使用します.
db.inventory.find ( { quantity: { $in: [20, 50] } } )

$and論理式
文法:{$and:[{},{},...,{}]}
$andは1つ以上の式で論理and操作を実行し、配列で指定されたすべての式で指定されたドキュメントdocumentをクエリーし、$andは短絡評価を使用し、最初の式の結果がfalseの場合、MongoDBは残りの式を実行しません.
たとえば、andクエリーは同じフィールドの複数のクエリー条件を指定します.
db.inventory.find( { $and: [ { price: { $ne: 1.99 } }, { price: { $exists: true } } ] } )
このクエリは、priceが1.99に等しくなく、priceフィールドが存在することを条件として、集合inventory内のすべてのドキュメントを選択します.
上記のクエリでは、暗黙的なAND操作も使用できます.次のようになります.
db.inventory.find( { price: { $ne: 1.99, $exists: true } } )
ANDクエリは、複数の式を使用して同じ操作を指定します.
db.inventory.find( {
    $and : [
        { $or : [ { price : 0.99 }, { price : 1.99 } ] },
        { $or : [ { sale : true }, { qty : { $lt : 20 } } ] }
    ]
} )
以上のフィールドは、priceフィールドの値が0.99または1.99に等しく、saleフィールドの値がtrueまたはqtyが20未満のすべてのドキュメントをクエリーします.
暗黙的なAND操作では、$or操作が一度だけ使用されていないため、クエリーを構築できません.
$not
構文:{ field: { $not: {  } } }$notは、指定した式で論理not操作を実行し、フィールドを含まないドキュメントを含む不一致式のドキュメントにクエリーします.
次のことを考慮します.
db.inventory.find( { price: { $not: { $gt: 1.99 } } } )
このクエリは、次の条件でinventoryコレクション内のドキュメントをクエリーします.
priceフィールドが1.99以下であるか、priceが存在しない.{ $not: { $gt: 1.99 } }は$lteオペレーションとは異なり、{$lte:1.99}オペレーションはpriceフィールドが存在し、1.99以下のフィールドのみを返します.
$notオペレータは、他のオペレータがフィールドとドキュメントを独立してチェックできないことに影響するだけであることを覚えておいてください.そのため、$notを使用して論理解析と$ne操作を行い、フィールドの内容をテストします.
$not操作を使用する場合は、次の操作を考慮します.
操作$notオペレータは他のオペレータと一致するが、配列などのデータ型などの予想外の結果を生じる.
$notオペレータは$regex正規表現操作をサポートせず、//またはあなたの駆動インタフェースを使用して代わりに、言語の正規表現機能を使用して正規表現オブジェクトを作成します.
パターンマッチング//:
db.inventory.find( { item: { $not: /^p.*/ } } )

このクエリはinventoryセットのitemフィールドがpで始まるすべてのドキュメントではないことをクエリします.
$nor
{ $nor: [ { <expression1> }, { <expression2> }, ...  { <expressionN> } ] }
は、次のことを考慮する.
db.inventory.find( { $nor: [ { price: 1.99 }, { sale: true } ]  } )
クエリーは、次の条件ですべてのドキュメントを返します.
フィールドを含むprice値は1.99ではなく、フィールドを含むsale値はtrueではなく、フィールドを含むprice値は1.99ではなく、フィールドsaleを含まない.または、フィールドpriceを含まず、フィールドsale値がtrueに等しくない場合を含む.またはフィールドpriceを含まない、フィールドsaleを含まない.
$nor追加比較
入校操作を考慮:
db.inventory.find( { $nor: [ { price: 1.99 }, { qty: { $lt: 20 } }, { sale: true } ] }
inventoryコレクションは、次の条件ですべてのドキュメントをクエリーします.
フィールドpriceは1.99に等しくなく、フィールドqtyは20以上であり、フィールドsaleはtrueに等しくない.クエリの結果には存在しないフィールドが含まれます.