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

MongoDB-コレクションのクエリ

    MongoDBは、db.collection.find()を提供します コレクション内のドキュメントをクエリするメソッド。

    db.collection.find() コレクション内のドキュメントを選択し、選択したドキュメントにカーソルを戻します。

    すべてのドキュメントを返却

    この例では、 ミュージシャン からすべてのドキュメントが返されます コレクション:

    db.musicians.find()

    結果:

    { "_id" : 1, "name" : "Ian Gillan", "instrument" : "Vocals" }
    { "_id" : 2, "name" : "Ian Paice", "instrument" : "Drums", "born" : 1948 }
    { "_id" : 3, "name" : "Roger Glover", "instrument" : "Bass", "born" : 1945 }
    { "_id" : 4, "name" : "Steve Morse", "instrument" : "Guitar", "born" : 1954 }
    { "_id" : 5, "name" : "Don Airey", "instrument" : "Keyboards", "born" : 1948 }
    { "_id" : 6, "name" : "Jeff Martin", "instrument" : "Vocals", "born" : 1969 }
    { "_id" : 7, "name" : "Jeff Burrows", "instrument" : "Drums", "born" : 1968 }
    { "_id" : 8, "name" : "Stuart Chatwood", "instrument" : "Bass", "born" : 1969 }
    

    フィルタリング基準としてパラメータを渡さなかったため、すべてのドキュメントが返されます。

    上記のクエリは、db.musicians.find( {} )の短縮版です。 。上記のクエリでは、中括弧{}を省略しました 。これは、MongoDBを使用する場合に完全に有効です。

    フィルタリング基準の追加

    関心のある基準のみを提供することで、結果を絞り込むことができます。

    たとえば、 Artists のDeepPurpleにのみ関心がある場合 コレクション:

    db.artists.find({ artistname : "Deep Purple" })

    結果:

    { "_id" : ObjectId("5781f85d48ef8c6b3ffb0150"), "artistname" : "Deep Purple", "albums" : [ { "album" : "Machine Head", "year" : 1972, "genre" : "Rock" }, { "album" : "Stormbringer", "year" : 1974, "genre" : "Rock" } ] }
    

    結果をフォーマットする

    上記の結果は少し読みにくいかもしれません。ドキュメントは1行の長いテキストとして返されます。

    pretty()を使用できます 結果を少し読みやすくするためにフォーマットする方法。

    pretty()を追加するだけです 最後に、このように:

    db.artists.find({ artistname : "Deep Purple" }).pretty()

    結果:

    { "_id" : ObjectId("5781f85d48ef8c6b3ffb0150"), "artistname" : "Deep Purple", "albums" : [ { "album" : "Machine Head", "year" : 1972, "genre" : "Rock" }, { "album" : "Stormbringer", "year" : 1974, "genre" : "Rock" } ] }
    

    その他のフィルタリングオプション

    結果をフィルタリングする方法は他にもいくつかあります。

    ANDを指定します 条件

    2つ以上の指定された値を含むドキュメントのみが返されるように指定できます。

    この例では、ドラムを演奏するミュージシャンのみがおよび指定します。 1950年以前に生まれた場所は返還されるべきです。両方の基準に一致するドキュメントのみが返されます。

    db.musicians.find( { instrument: "Drums", born: { $lt: 1950 } } )

    結果:

    { "_id" : 2, "name" : "Ian Paice", "instrument" : "Drums", "born" : 1948 }
    

    ORを指定します 条件

    どちらかの値がtrueであるように指定することもできます。条件の1つが真である限り、ドキュメントが返されます。

    この例では、ドラムを演奏するミュージシャン、または1950年より前に生まれたミュージシャンを含むドキュメントが必要です。

    db.musicians.find(
       {
         $or: [ { instrument: "Drums" }, { born: { $lt: 1950 } } ]
       }
    )

    結果:

    { "_id" : 2, "name" : "Ian Paice", "instrument" : "Drums", "born" : 1948 }
    { "_id" : 3, "name" : "Roger Glover", "instrument" : "Bass", "born" : 1945 }
    { "_id" : 5, "name" : "Don Airey", "instrument" : "Keyboards", "born" : 1948 }
    { "_id" : 7, "name" : "Jeff Burrows", "instrument" : "Drums", "born" : 1968 }
    

    $in オペレーター

    $in 演算子を使用すると、値のリストを指定できます。ドキュメントにこれらの値のいずれかが含まれている場合は、返されます。

    次の例を使用して、ボーカルまたはギターを弾いているすべてのミュージシャンを検索しています。

    db.musicians.find( { instrument: { $in: [ "Vocals", "Guitar" ] } } )

    結果

    { "_id" : 1, "name" : "Ian Gillan", "instrument" : "Vocals" }
    { "_id" : 4, "name" : "Steve Morse", "instrument" : "Guitar", "born" : 1954 }
    { "_id" : 6, "name" : "Jeff Martin", "instrument" : "Vocals", "born" : 1969 }
    

    ドキュメントの配列をクエリする

    この例では、ドキュメントの配列をクエリします。 2000年以降にリリースされたアルバムを検索します。

    db.artists.find(
       {
          albums: {
                    $elemMatch: {
                         year: { $gt: 2000 }
                    }
          }
       }
    ).pretty()

    結果:

    {
    	"_id" : ObjectId("578217c248ef8c6b3ffb015a"),
    	"artistname" : "Robben Ford",
    	"albums" : [
    		{
    			"album" : "Bringing it Back Home",
    			"year" : 2013,
    			"genre" : "Blues"
    		},
    		{
    			"album" : "Talk to Your Daughter",
    			"year" : 1988,
    			"genre" : "Blues"
    		}
    	]
    }
    {
    	"_id" : ObjectId("578217c248ef8c6b3ffb015b"),
    	"artistname" : "Snoop Dogg",
    	"albums" : [
    		{
    			"album" : "Tha Doggfather",
    			"year" : 1996,
    			"genre" : "Rap"
    		},
    		{
    			"album" : "Reincarnated",
    			"year" : 2013,
    			"genre" : "Reggae"
    		}
    	]
    }
    

    これらの結果には、2000年より前のアルバムも含まれていることに気付くでしょう。これは正しいです—これがドキュメント指向データベースの動作方法です。すべてのクエリはドキュメント全体を返します(ただし、指定された基準に一致するドキュメントのみ)。

    db.collection.findOne() 方法

    db.collection.findOne()を使用できます 指定されたクエリ条件を満たす1つのドキュメントを返すメソッド。

    複数のドキュメントが基準を満たしている場合、ディスク上のドキュメントの自然な順序によって決定されるように、最初のドキュメントのみが返されます。

    したがって、次のようにコレクション全体を検索します:

    db.musicians.findOne( )

    1つのドキュメントのみを返します:

    { "_id" : 1, "name" : "Ian Gillan", "instrument" : "Vocals" }
    

    findOne()を変更した場合 find()へ このように:

    db.musicians.find()

    コレクションには実際には8つのドキュメントがあることがわかります:

    { "_id" : 1, "name" : "Ian Gillan", "instrument" : "Vocals" }
    { "_id" : 2, "name" : "Ian Paice", "instrument" : "Drums", "born" : 1948 }
    { "_id" : 3, "name" : "Roger Glover", "instrument" : "Bass", "born" : 1945 }
    { "_id" : 4, "name" : "Steve Morse", "instrument" : "Guitar", "born" : 1954 }
    { "_id" : 5, "name" : "Don Airey", "instrument" : "Keyboards", "born" : 1948 }
    { "_id" : 6, "name" : "Jeff Martin", "instrument" : "Vocals", "born" : 1969 }
    { "_id" : 7, "name" : "Jeff Burrows", "instrument" : "Drums", "born" : 1968 }
    { "_id" : 8, "name" : "Stuart Chatwood", "instrument" : "Bass", "born" : 1969 }
    

    1. フラスコ:バックグラウンドワーカーのジョブを渡す(rq、redis)

    2. MongoDBデータベースのデータはどのようにディスクに保存されますか?

    3. クラスタ化されたnode.js/socket.io/redispub/subアプリケーションで重複したメッセージを受信して​​います

    4. Node.js、Socket.io、Redis pub / subの大容量、低遅延の問題