sql >> データベース >  >> NoSQL >> MongoDB

MongoDBでSQLLIKEステートメントを使用する方法

    このチュートリアルでは、official dummy datasetを使用します 、ニューヨーク周辺のレストランに関する多数のドキュメントが含まれています。

    .findOne()を使用した、このコレクションの基本的なドキュメント構造の例を次に示します。 方法:

    > db.restaurants.findOne()
    {
            "_id" : ObjectId("56c651e7d84ccfde319961af"),
            "address" : {
                    "building" : "469",
                    "coord" : [
                            -73.961704,
                            40.662942
                    ],
                    "street" : "Flatbush Avenue",
                    "zipcode" : "11225"
            },
            "borough" : "Brooklyn",
            "cuisine" : "Hamburgers",
            "grades" : [
                    {
                            "date" : ISODate("2014-12-30T00:00:00Z"),
                            "grade" : "A",
                            "score" : 8
                    },
                    {
                            "date" : ISODate("2014-07-01T00:00:00Z"),
                            "grade" : "B",
                            "score" : 23
                    },
                    {
                            "date" : ISODate("2013-04-30T00:00:00Z"),
                            "grade" : "A",
                            "score" : 12
                    },
                    {
                            "date" : ISODate("2012-05-08T00:00:00Z"),
                            "grade" : "A",
                            "score" : 12
                    }
            ],
            "name" : "Wendy'S",
            "restaurant_id" : "30112340"
    }
    
    検索の力

    MongoDBコレクション内を検索する際のパズルの最も重要な部分は、シンプルでありながら柔軟なdb.collection.find()です。 メソッド。

    .find()を使用 、いくつかの簡単なパラメータを渡すことで、ドキュメントのコレクションを簡単にクエリし、cursorを返すことができます。 。 cursor は単なる結果セットであり、cursorが指すドキュメントを操作したり、利用したりするために繰り返すことができます。 。

    .find()の簡単な例として 実行中のメソッドでは、Hamburgersをサーバーとするコレクション内のすべてのレストランを検索しようとします。 彼らのcuisineとして :

    >db.restaurants.find( { cuisine: "Hamburgers" } )
    { "_id" : ObjectId("56c651e7d84ccfde319961af"), "address" : { "building" : "469", "coord" : [ -73.961704, 40.662942 ], "street" : "Flatbush Avenue", "zipcode" : "11225" }, "borough" : "Brooklyn", "cuisine" : "Hamburgers", "grades" : [ { "date" : ISODate("2014-12-30T00:00:00Z"), "grade" : "A", "score" : 8 }, { "date" : ISODate("2014-07-01T00:00:00Z"), "grade" : "B", "score" : 23 }, { "date" : ISODate("2013-04-30T00:00:00Z"), "grade" : "A", "score" : 12 }, { "date" : ISODate("2012-05-08T00:00:00Z"), "grade" : "A", "score" : 12 } ], "name" : "Wendy'S", "restaurant_id" : "30112340" }
    ...
    

    結果セットは非常に大きいため、テスト例のより適切な測定は、.count()をチェーンすることです。 .find()へのメソッド クエリに一致するドキュメントの数を簡単に確認するには:

    > db.restaurants.find( { cuisine: "Hamburgers" } ).count()
    433
    

    たくさんのハンバーガーです!

    Regexを使用した単語の類似性の検索

    .find()を使用しているので コレクションをクエリするために、実際には構文をわずかに変更して、部分的である可能性のある単語またはフレーズに基づいて一致するものの検索を開始できます。 LIKEと同様に、特定のフィールド内で一致します SQLエンジンの演算子。

    秘訣はregular expressionsを利用することです (またはregex 略して)、これは基本的に検索パターンを定義するテキスト文字列です。 regexはたくさんあります わずかに異なる構文で記述されているエンジンですが、基本はすべて基本的に同じです。この場合、MongoDBはPerl Regex (PCRE)を使用します。 エンジン。

    最も基本的なレベルでは、regex 式は、両側が1つのスラッシュ(/)で囲まれた文字列(一連の文字)です。 。

    たとえば、regexを使用する場合 上記と同じクエリを実行して、Hamburgersを提供しているレストランの数を確認します 、文字列"Hamburgers"を置き換えることができます /Hamburgers/を使用 代わりに:

    > db.restaurants.find( { cuisine: /Hamburgers/ } ).count()
    433
    

    熱心なオブザーバーは、実行している実際のクエリについて何も効果的に変更していないことを認識している可能性があります。それでも、cuisineが含まれるすべてのドキュメントを検索しているだけです。 フィールドは等しい 文字列"Hamburgers"

    そうは言っても、regexを使用するだけです 通常の「引用符で囲まれた文字列」の代わりに、部分的な単語/フレーズの一致の検索を開始できます。 代わりに。

    たとえば、boroughを見てみましょう。 これがどのように機能するかについてのより良いアイデアを得るためのフィールド。まず、コレクション内に合計6つの自治区があることに気付くでしょう:

    > db.restaurants.distinct('borough')
    [
            "Brooklyn",
            "Bronx",
            "Manhattan",
            "Queens",
            "Staten Island",
            "Missing"
    ]
    

    それでは、regexを使用しましょう Bronxにあるレストランの数を確認する 自治区:

    > db.restaurants.find( { borough: /Bronx/ } ).count()
    2338
    

    しかし、boroughがあるレストランの数を見つけたいと想像してみてください。 で始まる 最初の3文字"Bro"regular expressionsを変更します 非常にわずかに、そのように:

    > db.restaurants.find( { borough: /^Bro/ } ).count()
    8424
    

    この結果セットには6000を超える追加のドキュメントが含まれています。これは、boroughで結果が得られるだけでなく、理にかなっています。 "Bronx"です 、だけでなく、"Brooklyn"のすべて 同様に。

    キャレット文字(^先頭である文字列内の場所を指定します したがって、これらの3文字がフィールドの中央にあるドキュメントがある場合、一致するものはありません。

    もう1つの簡単な例として、どこでも検索してみましょう。 "at"の文字のフィールド 、"Manhattan"の両方の結果が得られるはずです および"Staten Island"

    > db.restaurants.find( { borough: /Manhattan/ } ).count()
    10259
    
    > db.restaurants.find( { borough: /Staten Island/ } ).count()
    969
    
    > db.restaurants.find( { borough: /AT/i } ).count()
    11228
    

    案の定、最後のクエリでは2つの結果セットが1つに結合されました。

    私たちのキャラクターが"AT"であっても、気付くかもしれません。 regexでは大文字です 文字列ですが、小文字 実際のドキュメントレコードでは、まだ結果が返されました。これは、特別なiも追加したためです。 正規表現の終了スラッシュ(/)に続くフラグ )。これにより、regexに通知されます 検索でcase insensitiveにするエンジン 、大文字または小文字に関係なく一致します。


    1. Mongooseを使用してMongoDBドキュメントからキーを削除します

    2. mongodbの文字列日付形式でクエリ

    3. redisが最大オープンファイルを設定できない理由

    4. MongoDBの1対多の関係