この記事について
仕事でpymongoを使ったので備忘録としてこの記事を作成しました。
下記に分けて書いていこうと思います。
- 基本操作編(このページ)
0. MongoDBとは,pymongoとは
0. 接続方法
0. 挿入方法 -
割と便利な操作(bulk_write)編
0. bulk_write
参照:pymongo ドキュメント Bulk_Write -
あまり使わなかったけど調べ直したくないからメモしとくやつ(aggregate)編
0. aggregate
参照:MongoDB ドキュメントaggregate pipeline
動作環境
OS: Mac OS
MongoDB: 4.2
Python 3.6.8 :: Anaconda, Inc.
pymongo: 3.9.0
MongoDBとは?
- MongoDBの特徴として下記が挙げられる。
- NoSQL
-
JSON形式のデータであればスキーマの設定なしに登録できる。
Rest APIのレスポンスをそのままインサートしたりできたり、スキーマが異なっていてもDBに登録できて便利です。 - DBへの書き込みなどが早い
- 集計などの処理が独特
jsonのデータを格納できるため、配列の集計などもできますが、SQLよりわかりにくいです... - トランザクションなどが弱いRDBに慣れた方には異色な感じのDBかもしれません
pymongoとは?
名前から推測できるかと思いますが、pythonで動かすMongoDBのライブラリです。
pymongoの操作方法
基本的に下記を参考にざっくりとしたメモを作成していきます。
参考:pymongo ドキュメント
MongoDBとの接続
main.py
import pymongo
from pymongo import MongoClient
# デフォルト値のパラメータでの接続 (host=localhost,port = 27017)
# 実際は接続できるかどうかは保証できない
# findなどのDB読み書きでエラーが発生するっぽい
client = MongoClient() # DBの接続()
db = client.DB名 # DBの取得
collection = db.コレクション名 # コレクション(tableみたいなもの)の取得
挿入方法
- json形式のデータを挿入を行う
- 挿入されるデータは,_idが追加されてコレクションに追加される。
main.py
# コレクションへの挿入(引数にjson形式のデータを渡すだけ)
# データの作成
json_list = [{"x":i,"y":i*2,"z":i*3} for i in range(0,5)]
# document or documentsの挿入(非推奨らしい)
collection.insert(json_lsit)
# 1つのドキュメントだけ挿入
collection.insert_one({"x":255,"y":255,"z":255})
# データの作成
json_list = [{"x":i,"y":i*2,"z":i*3,"a":i*4} for i in range(0,5)]
# 複数のドキュメントの挿入
collection.insert_many(json_list)
検索方法
- ざっくりとしたイメージですが、SQLのselect句がprojection,where句がfilterと対応する感じです
参照:検索、表示のoperation
main.py
# 全件検索(filterに何も指定しなければ全件取得できる)
data = collection.find(filter={})
for i in data:
pprint.pprint(i)
# 検索(projectionで必要ないカラムを0にセットするだけ
# 0,1じゃなくてもTrue or False で表示のオンオフができるらしい
data = collection.find(filter={"x":{"$gt":1, # $gt:1 -> 1より大きい
"$lt":3}}, # $lt:3 -> 3より小さい
projection={"_id":0}
)
for i in data:
pprint.pprint(i)
削除方法
条件式のクエリはfindと同じ感じで使えるっぽい
main.py
# 基本的にシンプルに条件式を渡すだけ
# 条件に一致する一件のドキュメントを削除
collection.delete_one({"x":1})
# 条件に一致するドキュメントの削除(xが3以下のドキュメントの削除)
collection.delete_many({"x":{"$lt":3}})
# 条件式の指定なしで全件削除ができる(空のdictを渡すだけ)
# collection.delete_many({}) # 条件に一致するドキュメントの削除
更新方法
- upsertを指定することで、filterの条件に引っかからない場合、ドキュメントを挿入することもできる。
参照:更新のoperations
main.py
# filterで指定した条件に一致する1つのドキュメントをupdateに従って更新する
collection.update_one(filter,
update,
upsert=False
)
# filterで指定した条件に一致するドキュメントをupdateに従って更新する
collection.update_many(filter,
update,
upsert=False
)
ざっくりした説明ですが、基本的な操作はこんな感じです。
今度、気が向いたらbulk_write,aggregateとかもうちょっと丁寧に書いてみようと思います。