pythonでmongoDBを操作してみた。

昨年にmongoDBを入れてみて色々とやってるんですが、せっかくなのでpythonからmongoを制御できたら面白いのではないかと思い、少し試してみました。
ほとんどここのコピペ貼付けでやってるので残念感しかありませんが、まぁ写経でもアウトプットすることはきっと大事でしょうということで残しておきます。

後はmongoで日付時刻をそのまま格納したい場合はUTCが使用できる圏以外はあれやこれや大変なので日付を検索する仕様があるときはあまりmongoの日付時刻をそのまま使うと色々と大変な思いをします。
*現在、絶賛苦悩中

やるとするなら以下の様な感じになりそうです。
・日本時刻を一旦UTCに変換する
・mongoDBに格納
・mongoDBからデータ取り出し
・UTCの時刻を日本時間に変換する。

なので僕はへっぽこだったのでdatetimeにかなり苦しめられてます。(今も)
けど、結果的に時間でデータ格納せずに文字列で格納しちゃってて、さらに時間を条件にして検索するという要件を結果として採用しなかったのでここで出てくる日付で検索というケースは使用しなかったのですがね。

■プログラム

1.mongo_oerate.py
------------------
import datetime
import json
import pprint
import re
import sys
import traceback
from bson.objectid import ObjectId

import mongo_crud as mon

def insert_mongo():
"""
データ追加
"""
    try:
        print("INSERT START")
        mongo = mon.MongoInsert('database', 'test1')
        find = mongo.find({'_id':0})
        print('--------------------登録前--------------------')
        for doc in find:
            print(doc)
        insert_data = []
        i = 1
        for i in range(5):
            odict = {'new_column1': 'new_value' + str(i),
                     'new_column2': 'A-' + str(i),
                     'date_column': datetime.datetime.utcnow()
                     }
            insert_data.append(odict)
            i+=1
        result = mongo.insert_many(insert_data)
        print('-------------------登録情報-------------------')
        print(type(result))
        print(result)
        print('----------------------------------------------')
    except Exception as e:
        t, v, tb = sys.exc_info()
        print(traceback.format_exception(t,v,tb))
        print(traceback.format_tb(e.__traceback__))

def find_mongo():
"""
検索(1時間前の更新データ取得) UTCなので注意
"""
    try:
        tz = datetime.timezone.utc
        td = datetime.timedelta(hours=-1)
        start = datetime.datetime.now(tz) + td
        end = datetime.datetime.now(tz)

        print("FIND START")
        mongo = mon.MongoFind('database', 'test1')

        find = mongo.find({'_id':0})
        print('--------------------全件--------------------')
        i = 0
        for doc in find:
            print(doc)
            i +=1
        print('---------------------------------------------')
        print('レコード:'+str(i)+'件')

        find = mongo.find(filter={'updated':{'$gte': start,'$lt': end}},
                projection={'_id':0,})
        print('--------------------条件--------------------')
        for doc in find:
            print(doc)


    except Exception as e:
        t, v, tb = sys.exc_info()
        print(traceback.format_exception(t,v,tb))
        print(traceback.format_tb(e.__traceback__))

def delete_mongo():
"""
削除
"""
    try:
        print("DELETE START")
        mongo = mon.MongoDelete('database', 'test1')
        print('--------------------削除前--------------------')
        find = mongo.find()
        for doc in find:
            print(doc)
        print('-------------------削除情報-------------------')
        result = mongo.delete_one({'age': 100})

        print('--------------------削除後--------------------')
        find = mongo.find()
        for doc in find:
            print(doc)
    except Exception as e:
        t, v, tb = sys.exc_info()
        print(traceback.format_exception(t,v,tb))
        print(traceback.format_tb(e.__traceback__))

def update_mongo():
"""
更新
"""
    try:
        print("UPDATE START")
        mongo = mon.MongoUpdate('database', 'test1')
        find = mongo.find()
        for doc in find:
            print(doc)
        update = mongo.update_one({"new_column2": '/.*2$/'}, {'$set':{"new_Column2":"D9992"}})
        print('更新件数:' + str(update.matched_count))
        find = mongo.find()
        for doc in find:
            print(doc)
        print("UPDATE END")
    except Exception as e:
        t, v, tb = sys.exc_info()
        print(traceback.format_exception(t,v,tb))
        print(traceback.format_tb(e.__traceback__))

def main():
    try:
        insert_mongo()
        find_mongo()
    except Exception as e:
        t, v, tb = sys.exc_info()
        print(traceback.format_exception(t,v,tb))
        print(traceback.format_tb(e.__traceback__))

if __name__ == '__main__':
   main()


2.mongo_crud.py
-----------
from pymongo import MongoClient
from pymongo import DESCENDING
from pymongo import ASCENDING
import sys
import yaml


""" Connect """
def connDB(self, dbName, collectionName):
    try:
        with open('../config/db_config.yml', 'r') as yml:
             config = yaml.safe_load(yml)
             self.client = MongoClient(config['host'],
                                       username=config['username'],
                                       password=config['password'],
                                       authSource=dbName,
                                       authMechanism='SCRAM-SHA-1')
             self.db = self.client[dbName]
             self.collection = self.db.get_collection(collectionName)
             return self.collection
    except Exception as e:
        t, v, tb = sys.exc_info()
        print(traceback.format_exception(t,v,tb))
        print(traceback.format_tb(e.__traceback__))

""" Find """
class MongoFind(object):
    def __init__(self, dbName, collectionName):
        self.collection = connDB(self, dbName, collectionName)

    def find_one(self, projection=None,filter=None, sort=None):
        return self.collection.find_one(projection=projection,filter=filter,sort=sort)

    def find(self, projection=None,filter=None, sort=None):
        return self.collection.find(projection=projection,filter=filter,sort=sort)

""" Update """
class MongoUpdate(object):
    def __init__(self, dbName, collectionName):
        self.collection = connDB(self, dbName, collectionName)

    def find(self, projection=None,filter=None, sort=None):
        return self.collection.find(projection=projection,filter=filter,sort=sort)

    def update_one(self, filter, update):
        return self.collection.update_one(filter,update)

    def update_many(self, filter, update):
        return self.collection.update_many(filter,update)

    def replace_one(self, filter, replacement):
        return self.collection.replace_one(filter, replacement)

    def find_one_and_replace(self, filter, replacement):
        return self.collection.find_one_and_replace(filter, replacement)

""" Insert """
class MongoInsert(object):
    def __init__(self, dbName, collectionName):
        self.collection = connDB(self, dbName, collectionName)

    def find(self, projection=None,filter=None, sort=None):
        return self.collection.find(projection=projection,filter=filter,sort=sort)

    def insert_one(self, document):
        return self.collection.insert_one(document)

    def insert_many(self, documents):
        return self.collection.insert_many(documents)

""" Delete """
class MongoDelete(object):
    def __init__(self, dbName, collectionName):
        self.collection = connDB(self, dbName, collectionName)

    def find(self, projection=None,filter=None, sort=None):
        return self.collection.find(projection=projection,filter=filter,sort=sort)

    def delete_one(self, filter):
        return self.collection.delete_one(filter)

    def delete_many(self, filter):
        return self.collection.delete_many(filter)

    def find_one_and_delete(self, filter):
        return self.collection.find_one_delete(filter)


3.dbconfig.yml
------------
host: 'localhost'
username: 'username'
password: 'password'

■参考サイト

https://www.mongodb.com/blog/post/pymongo-monday-pymongo-create?utm_campaign=atlas_text_10.19&utm_source=stackoverflow&utm_medium=display&utm_term=text

コメント

このブログの人気の投稿

証券外務員1種勉強(計算式暗記用メモ)

GASでGoogleDriveのサブフォルダとファイル一覧を出力する

マクロ経済学(IS-LM分析)