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

MongoDBで基本的なクエリ操作を実行する方法

    この記事では、MongoDBで基本的なクエリ操作を実行する方法について説明します。インターネットの世界的な普及に伴い、今では比類のないペースでデータを作成しています。ある種の分析を行うには、データベースから必要なデータを収集/要求する必要があるため、データをクエリするための適切なツールを選択することが最も重要です。

    これが、特にMongoDBの出番です。 MongoDBは非構造化データベースであり、ドキュメントの形式でデータを保存します。さらに、MongoDBは膨大な量のデータを処理するのに非常に効果的であり、豊富なクエリ言語と多用途で簡単なデータアクセスを提供するため、最も一般的に使用されるNoSQLデータベースです。

    サンプルデータベースを作成する

    開始する前に、すべての操作を実行するためのサンプルデータを含むサンプルDBを作成します。

    myDBという名前のデータベースを作成します 注文という名前のコレクションを作成します 。この場合、ステートメントは次のようになります。

    > use myDB
    > db.createCollection("orders")
    >

    MongoDBは行と列を使用しません。データをドキュメント形式で保存します。コレクションはドキュメントのグループです。

    次のステートメントを使用して、データベース内のすべてのコレクションを確認できます。

    > use myDB
    >show collections
    orders
    system.indexes
    >

    次のステートメントを使用して、いくつかのドキュメントを挿入しましょう。

    > db.orders.insert([
    	{
    		Customer: "abc",
    		Address:{"City":"Jaipur","Country":"India"},
    		PaymentMode":"Card",
    		Email:"[email protected]",
    		OrderTotal: 1000.00,
    		OrderItems:[
    			{"ItemName":"notebook","Price":"150.00","Qty":10},
    			{"ItemName":"paper","Price":"10.00","Qty":5},
    			{"ItemName":"journal","Price":"200.00","Qty":2},
    			{"ItemName":"postcard","Price":"10.00","Qty":500}
    		]		
    	},
    	{
    		Customer: "xyz",
    		Address:{"City":"Delhi","Country":"India"},
    		PaymentMode":"Cash",
    		OrderTotal: 800.00,
    		OrderItems:[
    			{"ItemName":"notebook","Price":"150.00","Qty":5},
    			{"ItemName":"paper","Price":"10.00","Qty":5},
    			{"ItemName":"postcard","Price":"10.00","Qty":500}
    		]		
    	},
    	{
    		Customer: "ron",
    		Address:{"City":"New York","Country":"USA"},
    		PaymentMode":"Card",
    		Email:"[email protected]",
    		OrderTotal: 800.00,
    		OrderItems:[
    			{"ItemName":"notebook","Price":"150.00","Qty":5},
    			{"ItemName":"postcard","Price":"10.00","Qty":00}
    		]		
    	}
    ])

    ドキュメントはRDBMS行に相当します。各ドキュメントで同じスキーマを使用する必要はありません。これは、ドキュメントに値のないフィールドがない可能性があることを意味します。

    ドキュメントのクエリ

    find()メソッド

    MongoDBコレクションからドキュメントをクエリするには、find()メソッドを使用する必要があります。次のステートメントは、コレクションからすべてのドキュメントを取得します。

    > db.orders.find()
    	{
    		"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
    		Customer: "abc",
    		Address:{"City":"Jaipur","Country":"India"},
    		PaymentMode":"Card",
    		Email:"[email protected]",
    		OrderTotal: 1000.00,
    		OrderItems:[
    			{"ItemName":"notebook","Price":"150.00","Qty":10},
    			{"ItemName":"paper","Price":"10.00","Qty":5},
    			{"ItemName":"journal","Price":"200.00","Qty":2},
    			{"ItemName":"postcard","Price":"10.00","Qty":500}
    		]		
    	},
    	{
    		"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
    		Customer: "xyz",
    		Address:{"City":"Delhi","Country":"India"},
    		PaymentMode":"Cash",
    		OrderTotal: 800.00,
    		OrderItems:[
    			{"ItemName":"notebook","Price":"150.00","Qty":5},
    			{"ItemName":"paper","Price":"10.00","Qty":5},
    			{"ItemName":"postcard","Price":"10.00","Qty":500}
    		]
    	},
    	{
    		"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
    		Customer: "ron",
    		Address:{"City":"New York","Country":"USA"},
    		PaymentMode":"Card",
    		Email:"[email protected]",
    		OrderTotal: 600.00,
    		OrderItems:[
    			{"ItemName":"notebook","Price":"150.00","Qty":5},
    			{"ItemName":"postcard","Price":"10.00","Qty":00}
    		]
    	}
    >

    プロジェクション

    選択したフィールドのみをフェッチする場合は、プロジェクションを使用できます。次のステートメントは、顧客のみをフェッチします およびメール フィールド。

    > db.orders.find( { }, { Customer: 1, Email: 1 })
    	{
    		"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
    		Customer: "abc",
    		Email:"[email protected]"
    	},
    	{
    		"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
    		Customer: "xyz"		
    	},
    	{
    		"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
    		Customer: "ron",
    		Email:"[email protected]"		
    	}
    >

    条件を指定してドキュメントをフィルタリングする

    次に、指定した条件に一致するドキュメントをフェッチする方法を学習します。 MongoDBは、このための多くの比較演算子を提供します。

    1。 $eq演算子

    $ eq演算子は、フィールド値と指定された値が等しいかどうかをチェックします。 PaymentModeの注文を取得するには 「カード」は次のステートメントを使用できます

    >db.orders.find( { PaymentMode: { $eq: "Card" } } )

    このクエリは次のように書くこともできます

    >db.orders.find( { PaymentMode: "Card" } )

    同様のSQLステートメントは次のようになります

    SELECT * FROM orders WHERE PaymentMode="Card"

    >db.orders.find( { PaymentMode: "Card" }, { Customer: 1, PaymentMode: 1 } )
    	{
    		"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
    		Customer: "abc",
    		PaymentMode":"Card"				
    	},
    	{
    		"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
    		Customer: "ron",
    		PaymentMode":"Card"
    	}
    >

    $eq演算子とドキュメントが埋め込まれています

    埋め込まれたドキュメントアドレスを挿入したことにお気づきかもしれません 注文 コレクション。 の注文を取得する場合 'India'は、次のステートメントのようなドット表記を使用できます。

    >db.Orders.find( { "Address.Country": { $eq: "India" } } )

    このクエリは次のように書くこともできます

    >db.Orders.find( { "Address.Country":"India" } )

    >db.Orders.find( { "Address.Country": { $eq: "India" } } , { Customer: 1, Address: 1 })
    	{
    		"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
    		Customer: "abc",
    		Address:{"City":"Jaipur","Country":"India"}
    	},
    	{
    		"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
    		Customer: "xyz",
    		Address:{"City":"Delhi","Country":"India"}
    	}
    >

    $eq演算子と配列

    $ eq演算子は、指定された条件が配列内のいずれかの項目に当てはまる場合、すべてのドキュメントを取得します。 OrderItemsがあります ドキュメント内の配列。 'paper'も注文されたドキュメントをフィルタリングする場合、ステートメントは次のようになります。

    >db.Orders.find( { "OrderItems.ItemName": { $eq: "paper" } } )

    このクエリは次のように書くこともできます

    >db.Orders.find( { "OrderItems.ItemName": "paper"  } )

    >db.Orders.find( { "OrderItems.ItemName": { $eq: "paper" } } , { Customer: 1, OrderItems: 1 })
    	{
    		"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
    		Customer: "abc",
    		OrderItems:[
    			{"ItemName":"notebook","Price":"150.00","Qty":10},
    			{"ItemName":"paper","Price":"10.00","Qty":5},
    			{"ItemName":"journal","Price":"200.00","Qty":2},
    			{"ItemName":"postcard","Price":"10.00","Qty":500}
    		]		
    	},
    	{
    		"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
    		Customer: "xyz",
    		OrderItems:[
    			{"ItemName":"notebook","Price":"150.00","Qty":5},
    			{"ItemName":"paper","Price":"10.00","Qty":5},
    			{"ItemName":"postcard","Price":"10.00","Qty":500}
    		]
    	}
    >

    2。 $gtオペレーター

    $ gt演算子を使用して、フィールドの値が指定された値よりも大きいドキュメントを取得できます。次のステートメントは、 OrderTotalのドキュメントをフェッチします 800より大きい。

    >db.orders.find( { OrderTotal: { $gt: 800.00 } } )

    同様のSQLステートメントは次のようになります

    SELECT * FROM orders WHERE OrderTotal>800.00

    >db.Orders.find( { "OrderTotal": { $gt: 800.00 } } , { Customer: 1, OrderTotal: 1 })
    	{
    		"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
    		Customer: "abc",
    		OrderTotal: 1000.00
    	}
    >

    3。 $gteオペレーター

    $ gte演算子を使用して、フィールドの値が指定された値以上であるドキュメントを取得できます。次のステートメントは、 OrderTotalのドキュメントをフェッチします 800以上です。

    >db.orders.find( { OrderTotal: { $gte: 800.00 } } )

    同様のSQLステートメントは次のようになります

    SELECT * FROM orders WHERE OrderTotal>=800.00

    >db.Orders.find( { "OrderTotal": { $gte: 800.00 } } , { Customer: 1, OrderTotal: 1 })
    	{
    		"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
    		Customer: "abc",
    		OrderTotal: 1000.00
    	},
    	{
    		"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
    		Customer: "xyz",
    		OrderTotal: 800.00
    	}
    >

    4。 $ltオペレーター

    $ lt演算子を使用して、フィールドの値が指定された値よりも小さいドキュメントを取得できます。次のステートメントは、 OrderTotalのドキュメントをフェッチします 800未満です。

    >db.orders.find( { OrderTotal: { $lt: 800.00 } } )

    同様のSQLステートメントは次のようになります

    SELECT * FROM orders WHERE OrderTotal<800.00

    >db.Orders.find( { "OrderTotal": { $lt: 800.00 } } , { Customer: 1, OrderTotal: 1 })
    	{
    		"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
    		Customer: "ron",
    		OrderTotal: 600.00
    	}
    >

    4。 $lteオペレーター

    $ lte演算子を使用して、フィールドの値が指定された値以下であるドキュメントを取得できます。次のステートメントは、 OrderTotalのドキュメントをフェッチします 800以下です。

    >db.orders.find( { OrderTotal: { $lte: 800.00 } } )

    同様のSQLステートメントは次のようになります

    SELECT * FROM orders WHERE OrderTotal<=800.00

    >db.Orders.find( { "OrderTotal": { $lte: 800.00 } } , { Customer: 1, OrderTotal: 1 })
    	{
    		"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
    		Customer: "xyz",
    		OrderTotal: 800.00
    	},
    	{
    		"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
    		Customer: "ron",
    		OrderTotal: 600.00
    	}
    >

    5。 $neオペレーター

    $ ne演算子を使用して、フィールドの値が指定された値と等しくないドキュメントを取得できます。

    >db.orders.find( { PaymentMode: { $ne: "Card" } } )

    同様のSQLステートメントは次のようになります

    SELECT * FROM orders WHERE PaymentMode != "Card"

    >db.Orders.find( { "PaymentMode": { $ne: "Card" } } , { Customer: 1, PaymentMode: 1 })
    	{
    		"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
    		Customer: "xyz",
    		PaymentMode":"Cash"
    	}
    >

    6。 $in演算子

    $ in演算子を使用して、フィールドの値が指定された配列の任意の値と等しいドキュメントを取得できます。

    >db.orders.find( { OrderItems.ItemName: { $in: ["journal","paper"] } } )

    >db.Orders.find( { OrderItems.ItemName: { $in: ["journal","paper"] } } , { Customer: 1, OrderItems: 1 })
    	{
    		"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
    		Customer: "abc",
    		OrderItems:[
    			{"ItemName":"notebook","Price":"150.00","Qty":10},
    			{"ItemName":"paper","Price":"10.00","Qty":5},
    			{"ItemName":"journal","Price":"200.00","Qty":2},
    			{"ItemName":"postcard","Price":"10.00","Qty":500}
    		]		
    	},
    	{
    		"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
    		Customer: "xyz",
    		OrderItems:[
    			{"ItemName":"notebook","Price":"150.00","Qty":5},
    			{"ItemName":"paper","Price":"10.00","Qty":5},
    			{"ItemName":"postcard","Price":"10.00","Qty":500}
    		]
    	}
    >

    7。 $nin演算子

    $ nin演算子を使用して、フィールドの値が指定された配列のどの値とも等しくないドキュメントを取得できます。また、フィールドが存在しないドキュメントも選択します。

    >db.orders.find( { OrderItems.ItemName: { $nin: ["journal","paper"] } } )

    >db.Orders.find( { OrderItems.ItemName: { $nin: ["journal","paper"] } } , { Customer: 1, OrderItems: 1 })
    	{
    		"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
    		Customer: "ron",
    		OrderItems:[
    			{"ItemName":"notebook","Price":"150.00","Qty":5},
    			{"ItemName":"postcard","Price":"10.00","Qty":00}
    		]
    	}
    >

    インデックス作成

    大規模なデータベースでクエリを実行する場合、インデックス作成が非常に重要であることはわかっています。インデックスを作成しないと、クエリの実行にコストがかかる可能性があります。次のステートメントを使用して、単一のフィールドに単純な昇順インデックスを追加できます。

    >db.Orders.createIndex({"Customer":1})

    MongoDBは、デフォルトで「_id」フィールドに一意のインデックスを作成します。一意のインデックスは、そのフィールドに同じ値を持つ2つのドキュメントの挿入を防ぎます。一意のインデックスを作成する場合、ステートメントは次のようになります。

    db.Orders.createIndex( { "OrderId": 1 }, { unique: true } )

    結論

    今日、何か新しいことを学んだことを願っています。MongoDBについてさらにいくつか学びたい場合は、セルフホストのMongoDBに関する興味深い記事をご覧ください。また、自分で試してみて、コメントセクションで経験を共有してください。さらに、上記の定義のいずれかで問題が発生した場合は、以下のコメントでお気軽にお問い合わせください。


    1. ClusterControlを使用した複数のデータベーステクノロジーの管理

    2. from_jsonを使用して作成されたMongoEngineドキュメントオブジェクトは保存されません

    3. Mongoはポート27017(localhost)に自動的に接続しようとします

    4. RedisでGROUPBYを実行する方法