MongoDB:クエリ

以前のトピックであるMongoDB:ドキュメントの作成、更新、削除について書いた人もいますが 、これはオフの改作です。 ドキュメント、私はこれに完全に同意しません。 その情報が誰かにとって有用であることが判明したように思えたので、継続を投稿します。



Findは、MySQLのSELECTに類似しています。 MongoDBからドキュメントを取得するために使用されます。 ドキュメントの配列をコレクションとして返します;ドキュメントがない場合は、空のコレクション。 例:



> db.users.find();







コレクションからすべてのユーザーを返します。



> db.users.find( { age: 27 } );







年齢が27歳のすべてのユーザーを返します。



たとえば、次のように、いくつかのパラメーターを指定できます。



> db.users.find( { username: “joe”, age: 27 } );







文書から特定のフィールドを取得する必要がある場合があります。 この場合、リクエストは次のようになります。



> db.users.find( { }, { username: 1, email: 1 } );







その結果、デフォルトで常に返される「username」および「email」フィールドと「_id」フィールドを持つすべてのユーザーのみを取得します。 「_id」フィールドまたはその他のフィールドが必要ない場合、次のように指定できます。



> db.users.find( { }, { username: 1, email: 1, _id: 0 } );







条件付きのリクエスト





演算子:$ lt-less、$ lte-以下、$ gt-more、$ gte-more or equal、$ ne-not equal。

使用例:

18歳以上30歳未満のすべてのユーザーを取得します



> db.users.find( { age: { $gte: 18, $lte: 30 } } );







「username」が「joe」と等しくないすべてのユーザーを取得します



> db.users.find( { username: { $ne: “joe” } } );







コレクションに宝くじ券と番号が格納されており、当選番号390、754、454の宝くじのみを検索する必要があるとします。この場合、$ in演算子を使用します。



> db.users.find( { numbers: { $in: [ 390, 754, 454 ] } } );







つまり チケットには、これらの番号のいずれかが含まれている必要があります。

$ in演算子の反対は$ ninです。 類推すると、彼は上記の番号がないチケットのみを受け取ります。

$または演算子は、値のいずれかに一致するドキュメントを選択する必要がある場合にクエリに使用されます。 たとえば、番号が547であるか、「勝者」フィールドがtrueであるすべてのチケットを選択する必要があります。



> db.users.find( { $or: [ { tickect_number: 547 }, { winner: true } ] } );







$ mod演算子は、値が最初の引数で除算され、除算の残りが2番目の引数に等しいキーを選択するために使用されます。 わかりにくいように聞こえますが、より明確に:



> db.users.find( { user_id: { $mod: [ 5, 1 ] } } );







このようなクエリは、user_idが1、6、11、16などのすべてのユーザーを返します。

上記以外のすべてのユーザーを取得するには、$ not演算子を使用できます。



> db.users.find( { user_id: { $not: { $mod: [ 5, 1 ] } } } );







「user_id」2、3、4、5、7、8、9、10、12などのユーザーを取得します。

キーが存在するかどうかを確認するための演算子もあります-$が存在します



> db.c.find({"z" : {"$in" : [null], "$exists" : true}});







そのため、キー「z」が存在し、nullであるコレクション内のすべてのドキュメントを選択できます。



正規表現





私たちは皆、正規表現が非常に強力なものであることを知っています。 MongoDBはPerl互換の正規表現を使用します。

これは、joeまたはJoeという名前のすべてのユーザーを見つける方法です。



> db.users.find( { "name" : /^joe$/i } );







一般に、ローミングする場所があります。 同じjavascriptには多くのサービスがあり、常連を書いて確認することができます。



配列内のクエリ





食べ物のコレクションがあり、そこに果物の配列を含むドキュメントを挿入するとしましょう



> db.food.insert( { "fruit" : [ "apple", "banana", "peach" ] } );







それはそのような要求です



> db.food.find({"fruit" : "banana"});







彼を首尾よく見つけます。

配列の複数の要素のドキュメントを選択する必要がある場合は、演算子$ allを使用できます



> db.food.find( { fruits: { $all : [ "apple", "banana" ] } } );







このようなクエリは、フルーツアレイ内のすべてのドキュメントを返しますが、その中にはリンゴとバナナがあります。

次のように、配列内の要素が完全に一致することでドキュメントを取得できます。



> db.food.find( { fruits: [ "apple", "banana", "peach" ] } );







ブログがあり、コメントが含まれています。 最初の10個のコメントを取得したいです。 $スライス演算子が助けになります:



> db.blog.posts.findOne( { }, { "comments" : { "$slice" : 10 } } );







findOne-findと同様に機能しますが、最初に一致したドキュメントを返します。



最後の10個のコメントを取得する必要がある場合は、次のように記述します。



> db.blog.posts.findOne( { }, { "comments" : { "$slice" : -10 } } );







また、$スライスは中央からドキュメントを受け取ることができます。



> db.blog.posts.findOne( { }, { comments : { "$slice" : [ 23, 10 ] } });







この場合、23個の初期要素がスキップされ、可能であれば要素24から34が返されます



コマンドの制限、スキップ、ソート





要求に応じて限られた数のドキュメントを取得するには、limitコマンドを使用します。



> db.users.find().limit(3);







最初の3人のユーザーを返します。

複数のドキュメントをスキップして残りをすべて取得するには、skipコマンドを使用します。



> db.users.find().skip(3);







最初の3人を除くすべてのユーザーを取得します。

ソートするには、sortコマンドを使用します。 ソートは、昇順(1)および降順(-1)にできます。 ソートは、いくつかのキーによって優先度順に実行できます。



> db.users.find().sort( { username : 1, age : -1 } );







これらの3つのコマンドはすべて一緒に使用できます。



> db.stock.find( { "desc" : "mp3" } ).limit(50).skip(50).sort( { "price" : -1 } );







大きな値でskipコマンドを使用しても、非常に高速に動作しません。 例としてページネーションを使用してこれを検討してください。



ページネーションを行う最も簡単な方法は、最初に一定数のドキュメントを返し、その後、毎回この値に範囲をシフトすることです



> var page1 = db.foo.find(criteria).limit(100)

> var page2 = db.foo.find(criteria).skip(100).limit(100)

> var page3 = db.foo.find(criteria).skip(200).limit(100)








しかし、それはかなりゆっくり動作します。 ドキュメントが作成された日付に関して選択を行うとしましょう:



> var page1 = db.foo.find().sort( {"date" : -1} ).limit(100);







降順で並べ替えて、最初の100を取得します。スキップしないように、最後のドキュメントの日付を取得して、この日付のリクエストを既に行うことができます。



var page2 = db.foo.find( { "date" : { "$gt" : latest.date } } );







これにより、大きな値に対してskipコマンドを使用することを回避できます。



本質的に、これらはMongoDBのクエリに関する基本的なものです。 これが誰かに役立つことを願っています。



All Articles