このチュートリアルでは、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
にするエンジン 、大文字または小文字に関係なく一致します。