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

MongoDB find()

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

    collection 一部は、検索するコレクションまたはビューの名前です。

    これを使用して、すべてのドキュメント、一部のドキュメント、または1つのドキュメントのみを返すことができます。返すフィールドを指定することもできます。

    実際にドキュメントが返されるわけではないことに注意してください。 カーソルを返すだけです。 ドキュメントに。そうは言っても、「ドキュメントを返す」と言うのは簡単で、通常、この記事を含め、そのような方法で参照されます🙂

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

    実例を示します。

    db.pets.find()

    結果:

    { "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
    { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
    { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
    { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
    { "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 }

    ここでは、find()を使用します petsからすべてのドキュメントを返すメソッド コレクション。フィルタリング基準を提供しなかったため、これによりすべてのドキュメントが返されることがわかっています。実際、私たちは何の議論もしませんでした。

    引数なしで呼び出された場合、find() コレクションからすべてのドキュメントを返し、ドキュメントのすべてのフィールドを返します。

    上記を行う別の方法は次のようになります:

    db.pets.find({})

    この場合、空のドキュメントを渡します。

    この空のドキュメントに追加することで、結果のフィルタリングを開始できます。

    結果をフィルタリングする

    find()の実際の構文 このようになります:

    db.collection.find(query, projection)

    これは、最初の引数としてクエリを渡し、2番目の引数として射影を渡すことができることを意味します。

    クエリを渡すと、結果をフィルタリングするために使用されます。クエリは、クエリ演算子を含むドキュメントです。前の例で見たように、空のドキュメントはすべてのドキュメントを返します。

    結果をコレクション内のドキュメントのサブセットに絞り込みましょう。

    db.pets.find({"type":"Dog"})

    結果:

    { "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
    { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }

    これにより、結果がtypeを持つドキュメントのみに絞り込まれました。 Dogの値を持つフィールド 。

    この場合、フィルタリング基準としてドキュメントを渡すだけです。

    クエリ演算子を使用することもできます。これらにより、クエリにより具体的な基準を適用できます。

    例:

    db.pets.find({"weight": { $lt: 10 }})

    結果:

    { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
    { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
    { "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 }

    埋め込みドキュメント

    埋め込みドキュメントを含むドキュメントがある場合は、次の方法を使用して、埋め込みドキュメントのデータをクエリできます。

    • ドット表記(例:field.nestedfield: <value>
    • ネストされたフォーム(例:{field: { nestedfield: <value> } } )。このオプションはMongoDB4.4からのみ利用可能であることに注意してください。

    次のドキュメントを挿入するとします。

    db.pets.insertOne({
        "_id" : 6,
        "name" : "Fetch",
        "type" : "Dog",
        "specs" : {
            "height" : 400,
            "weight" : 15,
            "color" : "brown"
        }
    })

    ドット表記を使用して、埋め込まれたドキュメント内でクエリを実行できます。

    db.pets.find({ "specs.height": 400 })

    結果:

    { "_id" : 6, "name" : "Fetch", "type" : "Dog", "specs" : { "height" : 400, "weight" : 15, "color" : "brown" } }

    次のクエリは同じドキュメントを返しますが、今回はネストされたフォームを使用して埋め込みドキュメントを参照します。

    db.pets.find({ 
        "specs" : {
    		"height" : 400,
    		"weight" : 15,
    		"color" : "brown"
    	}
     })

    結果:

    { "_id" : 6, "name" : "Fetch", "type" : "Dog", "specs" : { "height" : 400, "weight" : 15, "color" : "brown" } }

    ネストされたフォームを使用する場合、クエリは埋め込みドキュメント全体と正確に一致する必要があります。たとえば、次のクエリは一致しません:

    db.pets.find({ 
        "specs" : {
    		"height" : 400
    	}
     })

    結果をフォーマットする

    前の例の結果は1行で返されました。 cursor.pretty()を使用できます 結果をより読みやすい形式で表示するようにカーソルを設定する方法。

    pretty()を使用するには メソッド、それをfind()に追加します メソッド。

    例:

    db.pets.find({ "_id": 6 }).pretty()

    結果:

    { "_id" : 6, "name" : "Fetch", "type" : "Dog", "specs" : { "height" : 400, "weight" : 15, "color" : "brown" } }

    配列

    配列要素をそのインデックスまたは値で参照することにより、配列内のデータを参照できます。

    次のドキュメントを挿入するとします。

    db.pets.insertOne({
        "_id" : 7,
        "name" : "Jake",
        "type" : "Dog",
        "awards" : [
            "Top Dog",
            "Best Dog",
            "Biggest Dog"
        ]
    })

    トップドッグ賞を受賞したすべての犬を検索したい場合は、次のクエリを作成できます(上記の犬が返されます)。

    db.pets.find({ 
        "awards": "Top Dog"
    }).pretty()

    結果:

    {
    	"_id" : 7,
    	"name" : "Jake",
    	"type" : "Dog",
    	"awards" : [
    		"Top Dog",
    		"Best Dog",
    		"Biggest Dog"
    	]
    }
    >

    次のように要素インデックスを指定することもできます:

    db.pets.find({ 
        "awards.0": "Top Dog"
    }).pretty()

    そのためには、指定された値が指定されたインデックスにある必要があります。したがって、次のクエリは同じ犬を返しません。

    db.pets.find({ 
        "awards.1": "Top Dog"
    }).pretty()

    配列はゼロベースであるため、インデックス0は最初の要素を指定し、1は2番目の要素を指定します。

    プロジェクション

    デフォルトでは、find()を使用すると、すべてのドキュメントフィールドが返されます。 。ただし、必要に応じて、プロジェクションを使用して返されるフィールドの数を減らすことができます。

    find()の構文を思い出してください。 このようになります:

    db.collection.find(query, projection)

    query フィルタリング基準(上記の例で行った)とprojectionを提供します 一致するドキュメントから返すフィールドを指定するオプションのプロジェクションです。したがって、プロジェクションを使用する場合は、クエリの後に配置するだけです。

    プロジェクションを使用する場合、含めるフィールドを指定できます 、除外するフィールド 、 または両方。これを行うには、フィールドの名前と1のいずれかをリストします (含める)または0 (除外するため)

    現在、私たちのコレクションには次のドキュメントが含まれています。

    { "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
    { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
    { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
    { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
    { "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 }
    { "_id" : 6, "name" : "Fetch", "type" : "Dog", "specs" : { "height" : 400, "weight" : 15, "color" : "brown" } }
    { "_id" : 7, "name" : "Jake", "type" : "Dog", "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] }

    投影法を使用して含めるフィールドを指定する例を次に示します。

    db.pets.find({}, { name: 1, type: 1 })

    結果:

    { "_id" : 1, "name" : "Wag", "type" : "Dog" }
    { "_id" : 2, "name" : "Bark", "type" : "Dog" }
    { "_id" : 3, "name" : "Meow", "type" : "Cat" }
    { "_id" : 4, "name" : "Scratch", "type" : "Cat" }
    { "_id" : 5, "name" : "Bruce", "type" : "Bat" }
    { "_id" : 6, "name" : "Fetch", "type" : "Dog" }
    { "_id" : 7, "name" : "Jake", "type" : "Dog" }

    _idに注意してください 予測に含めなかった場合でも、フィールドが返されます。このフィールドは例外であり、デフォルトで含まれています。

    _idが必要ない場合 返されるフィールドは、明示的に除外する必要があります。

    db.pets.find({}, { _id: 0, name: 1, type: 1 })

    結果:

    { "name" : "Wag", "type" : "Dog" }
    { "name" : "Bark", "type" : "Dog" }
    { "name" : "Meow", "type" : "Cat" }
    { "name" : "Scratch", "type" : "Cat" }
    { "name" : "Bruce", "type" : "Bat" }
    { "name" : "Fetch", "type" : "Dog" }
    { "name" : "Jake", "type" : "Dog" }

    別の例を次に示します。今回は、除外するフィールドのみを指定します。

    db.pets.find({}, { _id: 0, weight: 0, specs: 0, awards: 0 })

    結果:

    { "name" : "Wag", "type" : "Dog" }
    { "name" : "Bark", "type" : "Dog" }
    { "name" : "Meow", "type" : "Cat" }
    { "name" : "Scratch", "type" : "Cat" }
    { "name" : "Bruce", "type" : "Bat" }
    { "name" : "Fetch", "type" : "Dog" }
    { "name" : "Jake", "type" : "Dog" }

    その他の予測

    投影でできることは他にもいろいろあります。たとえば、MongDB 4.4以降では、集計式を使用して、投影されたフィールドの値を指定できます。

    例:

    db.pets.find({}, { 
        "_id": 0,
        "n": "$name", 
        "t": "$type", 
        "w": "$weight" 
        })

    結果:

    { "n" : "Wag", "t" : "Dog", "w" : 20 }
    { "n" : "Bark", "t" : "Dog", "w" : 10 }
    { "n" : "Meow", "t" : "Cat", "w" : 7 }
    { "n" : "Scratch", "t" : "Cat", "w" : 8 }
    { "n" : "Bruce", "t" : "Bat", "w" : 3 }
    { "n" : "Fetch", "t" : "Dog" }
    { "n" : "Jake", "t" : "Dog" }

    ここでは、フィールド名の名前を変更しました。これを行うには、$fieldNameを使用して、各フィールドの新しい名前を文字列リテラルとして指定します。 そのフィールド値を出力する構文。結果は、SQLでエイリアスを使用するのと少し似ています。

    詳細情報

    詳細については、MongoDBのドキュメントを参照してください。


    1. mongoでトランザクションのロールバックを実現するにはどうすればよいですか?

    2. celery celerybeatはDjangoなしでデータベーススケジューラを使用できますか?

    3. mongodbのコレクションごとに複数のスキーマを使用する

    4. redisでのパイプラインとトランザクション