pymongoで重複など該当する条件があるときにデータを挿入しないようにする

Share on Facebook
Pocket
LINEで送る
Bookmark this on Google Bookmarks

[CentOS7]

[Python3] Pymongoの基本的な使い方 にちょっと関連。

 

方法

重複など条件が該当する場合に挿入しないようにするには、updateメソッドupsertオプション を利用する。
利用方法は以下のとおり。

    # MongoDBへの接続
    mongo_client = MongoClient('localhost:27017')
    # データベースの選択
    db_connect = mongo_client["db_name"]

    db_connect["collection_name"].update(
            {判定する条件},
            {'$setOnInsert': {挿入するデータ}},
            upsert=True)

 

手順

[CentOS7]

[Python3] Pymongoの基本的な使い方でコレクションを作成していた場合は、一度コレクションを削除しておく。

$ mongo
> show databases;
db_name  0.078GB
local    0.078GB
> use db_name;
switched to db db_name
> db["collection_name"].drop()
true
> exit
bye

pymongoが使える仮想環境に入り、upsert.pyを作成し事前にコレクションとデータを作成しておく。

$ source ~/mongo_python/bin/activate
(mongo_python)$ cd ~/mongo_python/source/
(mongo_python)$ vi upsert.py
# -*- coding: utf-8 -*-

from pymongo import MongoClient

if __name__ == "__main__":

    mongo_client = MongoClient('localhost:27017')
    db_connect = mongo_client["db_name"]

    # データをたくさん挿入する
    db_connect["collection_name"].insert_many([{'x':i} for i in range(0,10)])

    # 生成したデータを表示する
    for x in collection_list:
        print(x)

(mongo_python)$ python upsert.py
{'x': 0, '_id': ObjectId('557eacbda245871d842d0d8c')}
{'x': 1, '_id': ObjectId('557eacbda245871d842d0d8d')}
{'x': 2, '_id': ObjectId('557eacbda245871d842d0d8e')}
{'x': 3, '_id': ObjectId('557eacbda245871d842d0d8f')}
{'x': 4, '_id': ObjectId('557eacbda245871d842d0d90')}
{'x': 5, '_id': ObjectId('557eacbda245871d842d0d91')}
{'x': 6, '_id': ObjectId('557eacbda245871d842d0d92')}
{'x': 7, '_id': ObjectId('557eacbda245871d842d0d93')}
{'x': 8, '_id': ObjectId('557eacbda245871d842d0d94')}
{'x': 9, '_id': ObjectId('557eacbda245871d842d0d95')}

upsert.pyをデータを挿入するように編集する。
x:10のデータがない場合にx:10のデータを挿入するようにする。
上で確認したように、現段階ではx:10のデータはない。

# -*- coding: utf-8 -*-

from pymongo import MongoClient

if __name__ == "__main__":

    mongo_client = MongoClient('localhost:27017')
    db_connect = mongo_client["db_name"]

    """
    # データをたくさん挿入する
    db_connect["collection_name"].insert_many([{'x':i} for i in range(0,10)])

    collection_list = db_connect["collection_name"].find()
    """

    # x==10のデータがなければ10を追加する。
    db_connect["collection_name"].update(
            {"x": 10},
            {'$setOnInsert': {"x": 10}},
            upsert=True)

    collection_list = db_connect["collection_name"].find()

    for x in collection_list:
        print(x)

実行してみる。

(mongo_python)$ python upsert.py
{'x': 0, '_id': ObjectId('557eacbda245871d842d0d8c')}
{'x': 1, '_id': ObjectId('557eacbda245871d842d0d8d')}
{'x': 2, '_id': ObjectId('557eacbda245871d842d0d8e')}
{'x': 3, '_id': ObjectId('557eacbda245871d842d0d8f')}
{'x': 4, '_id': ObjectId('557eacbda245871d842d0d90')}
{'x': 5, '_id': ObjectId('557eacbda245871d842d0d91')}
{'x': 6, '_id': ObjectId('557eacbda245871d842d0d92')}
{'x': 7, '_id': ObjectId('557eacbda245871d842d0d93')}
{'x': 8, '_id': ObjectId('557eacbda245871d842d0d94')}
{'x': 9, '_id': ObjectId('557eacbda245871d842d0d95')}
{'x': 10, '_id': ObjectId('557eae7b0347a5076001272c')} <- データが挿入されている。

今度は条件に該当した場合のデータの挿入をしてみる。

# -*- coding: utf-8 -*-

from pymongo import MongoClient

if __name__ == "__main__":

    mongo_client = MongoClient('localhost:27017')
    db_connect = mongo_client["db_name"]

    """
    # データをたくさん挿入する
    db_connect["collection_name"].insert_many([{'x':i} for i in range(0,10)])

    collection_list = db_connect["collection_name"].find()
    """

    """
    # x==10のデータがなければ10を追加する。
    db_connect["collection_name"].update(
            {"x": 10},
            {'$setOnInsert': {"x": 10}},
            upsert=True)
    """

    # x==1のデータがなければ11を追加する。
    # x==1のデータがあるので追加されない。
    db_connect["collection_name"].update(
            {"x": 1},
            {'$setOnInsert': {"x": 11}},
            upsert=True)

    collection_list = db_connect["collection_name"].find()

    for x in collection_list:
        print(x)

実行すると、x:1のデータが既にあるため、x:11のデータが挿入されていないことがわかる。

(mongo_python)$ python upsert.py
{'_id': ObjectId('557eacbda245871d842d0d8c'), 'x': 0}
{'_id': ObjectId('557eacbda245871d842d0d8d'), 'x': 1}
{'_id': ObjectId('557eacbda245871d842d0d8e'), 'x': 2}
{'_id': ObjectId('557eacbda245871d842d0d8f'), 'x': 3}
{'_id': ObjectId('557eacbda245871d842d0d90'), 'x': 4}
{'_id': ObjectId('557eacbda245871d842d0d91'), 'x': 5}
{'_id': ObjectId('557eacbda245871d842d0d92'), 'x': 6}
{'_id': ObjectId('557eacbda245871d842d0d93'), 'x': 7}
{'_id': ObjectId('557eacbda245871d842d0d94'), 'x': 8}
{'_id': ObjectId('557eacbda245871d842d0d95'), 'x': 9}
{'_id': ObjectId('557eae7b0347a5076001272c'), 'x': 10}

 

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です