MongoDBは、最も人気のある非リレーショナル(NoSQLデータベースとも呼ばれる)データベースの1つです。
非リレーショナルデータベースまたはNoSQLデータベースは、従うべき固定テーブル構造やスキーマを持たないため、データベースが非常に柔軟でスケーラブルになります。
NoSQLデータベースのデータは、RSONと呼ばれるJSONに似た形式で保存されます。
MongoDBは、大規模で非構造化データを扱う際に非常に便利であるため、データ分析において最も広く使用されているデータベースです。
また、高速性と可用性を兼ね備えています。
この記事では、PythonスクリプトをMongoDBに接続し、必要な処理を実行する方法を見てみましょう。
Python MongoDB ドライバ
PyMongo は MongoDB と python を接続するためのネイティブドライバです。
PyMongo には Python のコードからデータベース操作を行うためのライブラリがすべて揃っています。
pymongoは低レベルのドライバなので、高速で直感的で、より多くの制御が可能です。
PyMongoをインストールするには、コマンドラインを開き、次のコマンドを入力します。
C:UsersYour NameAppDataLocalProgramsPythonPython36-32Scripts>python -m pip install pymongo
|
このコマンドを実行すると、PyMongoがインストールされます。
これでスクリプトにPyMongoがインストールされ、MongoDBのリソースにアクセスできるようになりました。
MongoDBデータベース
では、MongoDB でデータベースを作ってみましょう。
データベースの作成には PyMongo の MongoClient() クラスを使います。
正しいローカルホストの IP アドレスと post を渡してデータベースを作成します。
そしてクライアントを使用して、データベースに任意の名前を付けます。
from pymongo import MongoClient #Creating a pymongo client client = MongoClient('localhost', 27017) #Getting the database instance db = client['mongodb1'] print("Database created.") #Verify the database print("List of existing databases") print(client.list_database_names()) |
出力
Database created.
List of existing databases:
['admin', 'config', 'local', 'mongodb1']
コレクションの作成
データベース内部では、複数のコレクションを作成することができる。
コレクションは、従来のデータベースのテーブルと比較することができ、コレクションに複数のレコードを格納することができる。
では、データベース内にコレクションを作成する方法を見てみましょう。
なお、コレクションは少なくとも1つの文書が挿入されると作成されることに注意してください。
#create a collection named "students" mycol = mydb["students"] |
Insert into Collection
レコードのことを MongoDB ではドキュメントと呼びます。
コレクションにドキュメントを挿入するには、 insert_one() メソッドを使います。
insert_one メソッドの引数には、作成したドキュメントを渡すことができます。
ドキュメントを挿入する方法を例で説明します。
#create a document test = { "name": "Ripun", "class": "Seventh" } #insert a document to the collection x = mycol.insert_one(test) |
複数のレコードを挿入する
コレクションに複数のレコードを挿入するには、insert_many()メソッドを使用します。
これを実装するために、まず複数のドキュメントを含むリストを作成し、それらを insert_many() メソッドに渡します。
mylist = [
{ “name”: “Amy”, “class”: “Seventh”},
{ “name”: “ハンナ”, “クラス”: “Sixth”},
{ “名前”: “Viola”, “class”: “Sixth”}] x= mycol.insert_many(mylist)
また、idで挿入することもできます。
mylist = [ { "_id":1,"name": "Amy", "class": "Seventh"}, { "_id":2,"name": "Hannah", "class": "Sixth"},
{ "_id":3,"name": "Viola", "class": "Sixth"}]
x = mycol.insert_many(mylist) print(x.inserted_ids) |
コレクションからドキュメントにアクセスする
さて、コレクションが構造化され、データがロードされたら、 私たちの要件に基づいてそれらにアクセスしたいと思います。
データにアクセスするには、find() メソッドを使用します。
find_one()メソッドは、コレクション内の最初の出現箇所を返します。
find()メソッドは、コレクション内のすべての出現箇所を返します。
find()メソッドをパラメータなしで使用した場合、SQLのSelect allと同じように動作します。
出力
x = mycol.find_one() # This prints the first document print(x) for x in mycol.find(): print(x)
|
時には、ドキュメントの特定のフィールドだけを取得したいことがあります。
そのフィールドを結果に含めるには、渡されたパラメータの値が1でなければならず、値が0であれば、それは結果から除外されます。
for x in mycol.find({},{ "_id": 0, "name": 1, "class": 1 }): print(x)
|
上記のコードでは、コレクションからnameとclassフィールドを返し、idフィールドは除外します。
MongoDB データベースに問い合わせる
find() を使って、クエリオブジェクトを使ったより詳細な方法で結果を取得することができます。
演算子
MongoDB のクエリで使われる演算子の一覧は、次のとおりです。
| 演算子|構文|例
| — | — | — |
| 等式|{“キー” : “値”}|db.mycol.find(“by”) | db.mycol.find({“by”: “tutorials point”}) | 小数点以下の値
| 小さくなる| {“key” :{$lt: “value”}}| db.mycol.find({“by”: “tutorials point”}}) | db.mycol.find({“likes”:{$lt:50}}) | | 小さくて等しい
| イコール未満 | {“key” :{$lte: “value”}}。
| db.mycol.find({“likes”:{$lte:50}}) || 大なり小なり
| 大なり|{“key” :{$gt: “value”}}。
| 大なり小なり| db.mycol.find({“likes”:{$gt:50}}) ||大なり小なり
| 大なり小なり|{“key” {$gte: “value”}} | 等しくない|db.mycol.find({“likes”:{$gte:50}})||大同小異
| 等しくない|{“key”:{$ne: “値”}} | db.mycol.find({“likes”:{$ne:50}}) ||等しくない。
コード例
次のコードは、nameフィールドがSathishであるドキュメントを取得します。
from pymongo import MongoClient #Creating a pymongo client client = MongoClient('localhost', 27017) #Getting the database instance db = client['sdsegf'] #Creating a collection coll = db['example'] #Inserting document into a collection data = [ {"_id": "1001", "name": "Ram", "age": "26", "city": "Hyderabad"},
{"_id": "1002", "name": "Mukesh", "age": "27", "city": "Bangalore"},
{"_id": "1003", "name": "Vel", "age": "28", "city": "Mumbai"},
{"_id": "1004", "name": "Sathish", "age": "25", "city": "Pune"},
{"_id": "1005", "name": "Rashiga", "age": "23", "city": "Delhi"},
{"_id": "1006", "name": "Priya", "age": "26", "city": "Chennai"}
] res = coll.insert_many(data) print("Data inserted ......") #Retrieving data print("Documents in the collection: ") for doc1 in coll.find({"name":"Sathish"}): print(doc1)
|
出力
Data inserted ......
Documents in the collection:
{'_id': '1004', 'name': 'Sathish', 'age': '25', 'city': 'Pune'}
では、年齢が25歳以上の人のレコードを検索してみましょう。
ここでは、$gt演算子を使って実装します。
for doc in coll.find({"age":{"$gt":"25"}}):
print(doc)
出力
{“_id”: 「1002″、”name”: 「Mukesh”、”age”: 「27歳」、「都市」: 「バンガロール}
{ {“_id”: “1003”、”名前”: “Vel”、”age”: “28歳” “都市名” “Mumbai”}」となります。
同様に、$ltを使用すると、指定した値より小さい値を持つレコードをフィルタリングできます。
これらの演算子は、文字列に対して使用することもできます。
たとえば、「name」:{「$gt」: “J”}とすると、「J」で始まる名前、またはそれ以降のアルファベットを含むレコードをすべて取得することができます。
Python による MongoDB の Delete オペレーション
ひとつのドキュメントを削除するには delete_one() メソッドを使います。
delete_one()` メソッドの最初のパラメーターは、削除するドキュメントを示すクエリオブジェクトです。
myquery = {"name" : "Mukesh"} coll.delete_one(myquery) |
複数の文書を削除するには、delete_many()メソッドを使用します。
myquery = { "name": {"$regex": "^S"} } x = coll.delete_many(myquery) |
上記のコードは、人名が ‘S’ で始まるレコード、または S の後にアルファベットを並べたレコードをすべて削除します。
コレクション内のすべての文書を削除するには、delete_many()
メソッドに空のクエリオブジェクトを渡せばよい。
以下のコードでは、コレクション内のすべての文書を削除します。
x = coll.delete_many({}) |
コレクション全体を削除したい場合は、drop()メソッドを使用します。
coll.drop()
おわりに
この記事では、MongoDB を python に接続し、必要かつ不可欠なさまざまな操作を実行することについて見てきました。
読者は MongoDB を実際に使ってみて、構文やさまざまなクエリに慣れることを強くおすすめします。