MongoDBクエリ演算子と配列操作( M 001 -パート3 )


When exact matching is not enough.


私たちはすでに基本的な船体活動をカバーしました.このセクションを包む前に、しばしば使用されるより高度な概念を紹介したいと思います.

データ比較
これまで、我々はほとんど提供されているクエリに厳密に一致するフィールドによってドキュメントを検索します.これは、我々が日に使う比較の唯一のタイプから遠いです.

Query operators: Tools to locale the requested data in a database.


私たちが使用するすべての演算子は$ サイン.
たとえば、クエリ演算子の使用方法を以下に示します.
{ <field>: { <operator>: <value> } }
以下にいくつかの一般的な演算子を示します.
  • $eq : 正確なマッチングのために"等しい"
  • $ne : 除外のために「等しくない」;
  • $gt : 要求された値が問い合わせで提供される値より「大きい」ならば
  • $gte : 要求された値が照会において提供される値より大きいか等しい
  • $lt : 要求された値がクエリで提供された値よりも"小さい"
  • $lte : 要求された値が照会において提供される値より少ないか、等しいならば、マッチします;
  • たとえば、10.000人以上の市民を持つ都市を探すことは、次のようになります.
    db.cities.find({ "citizens": { "$gt": 10000 } })
    
    米国外の都市を探すのは、このタイプの問い合わせを使用して行うことができます
    db.cities.find({ "country": { "$ne": "USA" } })
    
    待って、私は10.000市民以上の都市を見つける必要がある場合は、米国の外に同じ時間ですか?我々は、そうするために我々の声明をチェインする必要があります.

    連鎖声明
    読むのを止めないでください、私は私が論理ゲートの理論であなたを激しく打つつもりはないと約束します.
    あなたは、あなたがいくつかの声明に合っている文書を望む状況であなた自身を見つけるかもしれません.場合によっては、すべてのステートメント、いつか少なくともそれらのいずれか、または何も一致する必要があります.
    これは、ソフトウェア開発において一般的な必要性であり、データベースの問い合わせにも一般的です.
    例えば、ガソリンスタンドの後ろのルールを表すことができます.
    const stationCanServeGas = customerPaymentAuthorized() && thereIsGasLeft()
    
    MongoDBは別の構文と論理演算子を使用して同じ目標を達成するためのツールを提供します.

    Logic operators: Tools to chain statement with specific behaviours


  • $and : 書類は、提供されたすべての文と一致しなければなりません

  • $or : 文書は、少なくとも一つの文と一致しなければならない

  • $nor : 文書は、そのステートメントのどれにもマッチしない

  • $not : 指定した式を否定します.
  • 最初の3演算子$and , $or and $nor ステートメントの配列と同様の構文を持ちます.
    { <operator>: [ { statement1 }, { statement2 }, ... ] }
    
    The $not オペレーターは完全に異なりますthe documentation 動作と構文の詳細については.
    最初の演算子に戻ると、すべての有効なユーザを見つけることができます.
    db.users.find({
        "$and": [{
            "$or": [{
                "registrationCompleted": true
            }, {
                "ongoingRegistration": true
            }]
        }, {
            "ongoingDeletion": false
        }]
    })
    
    The $and 演算子はデフォルトで暗黙的です.つまり、リクエストを簡単にするために無視できます.ここでは、暗黙のうち$and :
    db.users.find({
        "$or": [{
            "registrationCompleted": true
        }, {
            "ongoingRegistration": true
        }],
        "$not": { "ongoingDeletion": true }
    })
    
    我々はさらに暗黙のうちに行くことができます$and 同じフィールドに複数の文を行うとき.ここで5と10時間の間に完了するコースを返す2つの方法があります.
    db.courses.find({
        "$and": [{
            "estimateTimeToComplete": {
                "$gt": 5
            }
        }, {
            "estimateTimeToComplete": {
                "$lt": 10
            }
        }]
    })
    
    db.courses.find({
        "estimateTimeToComplete": {
            "$gt": 5,
            "$lt": 10
        }
    })
    
    ご覧の通り、同じ目標を達成する方法がいくつかあります.いくつかはより冗長であるか、他より読みやすいです.それはあなたにそれらを維持し、理解しやすいようにするまでです!

    表現型質問演算子による文書内の分野の比較

    Expressive query operator: Adds expressiveness to the query language by allowing us to use variables and conditions statements. It also allows for the use of aggregation expressions, discussed in a next article.


    以下に、このタイプの演算子の基本的な構文を示します:
    { "$expr": { <statement> } }
    
    私たちは$ 明示的なクエリ演算子の内部で、ドキュメントのフィールド値を参照するシンボルです.
    この概念をより具体的に行動させようとしましょう.ここでは、我々は現在市民より多くの観光客を歓迎する都市を見つけようとすることができる方法です
    db.cities.find({
        "$expr": {
            "$gt": ["$population", "$tourists"]
        }
    })
    
    構文の変更に注意してください.集約パイプラインについて話をするとき、我々はそれを深くカバーします.

    アレイフィールドの問い合わせと操作
    mql構文では、多くの演算子が配列の問い合わせと操作を行います.私たちは既に$push 前の記事の演算子は、ここで蒸留された説明です.

    $push: Adds one or many elements to an array or turn the field into an array if it was of a different type.


    ここでは、コースで学生を追加する方法です
    db.courses.updateMany({
        "subject": "Mongodb"
    }, {
        "$push": {
            "students": "Eliot Horowitz"
        }
    })
    
    配列の要素に基づいたドキュメントを検索するには、いくつかの方法を使用できます.
  • ある要素を持つ配列を探す場合、他の要素が存在する場合は関係ありません.
  • db.<collection>.find({ <the_array>: <one_of_the_element> })
    
  • 提供される要素の正確なリストを配列で探すとき:
  • db.<collection>.find({ <the_array>: [<the_first_element>, <the_second_element>, <...>] })
    
  • 指定した要素の配列を任意の順序で探します.
  • db.<collection>.find({ <the_array>: { "$all": [<the_first_element>, <the_second_element>, <...>] } })
    
    また、$size 演算子.たとえば、10人の学生とエリオットHorowitz、ケビンライアンとドワイトMerrimanでコースを探すことは、このように見えることができました:
    db.courses.find({
        "students": {
            "$size": 10,
            "$all": [
                "Eliot Horowitz",
                "Kevin Ryan",
                "Dwight Merriman",
            ]
        }
    })
    
    配列問い合わせのための高度なツールの一つは、$ elemmatchです.

    $elemMatch: Returns every document with the array field containing at least one element matching the query.


    私たちのコースコレクションの学生は、この文脈では、その名前、年齢や他の有用な情報を持つ複雑なオブジェクトであると言う.法的目的のために、私たちは18歳未満の少なくとも1人の学生とコースを見つけたいです.以下のクエリを実行します.
    db.courses.find({
        "students": {
            "$elemMatch": {
                "age": {
                    "$lte": 18
                }
            }
        }
    })
    
    MQLによって提供されるもう一つの有用なツールは、彼のインデックスに基づいて配列の特定の要素を検索することを可能にします.
    例えば、私たちが最初の学生が「メリマン」と命名されるあらゆるコースを得たいと言います.この目標を達成するには、次の構文を使用します.
    db.courses.find({
        "students.0.name": "Merriman"
    })
    

    予測で結果を見つける
    プロジェクションを指定することで、どのフィールドをクエリに返すかを決めることができます.
    db.<collection>.find({ <query> }, { <projection> })
    
    このフィールドは1つの値を持つキー値ペアの集合であり、フィールドを含めるか、除外したい場合は0です.含まれているフィールドを持つプロジェクションで除外することができます“らせんID”フィールドを除いて、1つの投影でゼロと1を混在させることはできません.
    例えば、私たちがコースの学生と主題だけを望むならば、我々は以下の投射を定義することができます:
    db.courses.find({}, {
        "subject": 1,
        "students": 1
    })
    
    組み合わせの予測とクエリも可能です.ここでは、以前のクエリを使用する方法について説明します.
    db.courses.find({
        "students": {
            "$size": 10,
            "$all": [
                "Eliot Horowitz",
                "Kevin Ryan",
                "Dwight Merriman",
            ]
        }
    }, {
        "subject": 1,
    })
    
    この記事はMongoDB認証に関するシリーズの最初の部分をラップします.それは長い興味深いまだ旅されている!私は、あなたが私が基本的なクラスタ管理、集約フレームワークとコースの最後の主題をカバーするために熱心であることを望みます😁