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

Facebook にシェア
Pocket
LINEで送る
このエントリーを Google ブックマーク に追加

[CentOS7]

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

[amazonjs asin=”1617291609″ locale=”JP” title=”Mongodb in Action”]

 

方法

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

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

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

[/python]

 

手順

[CentOS7]

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

[shell title=”コレクションの削除”] $ 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
[/shell]

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

[shell] $ source ~/mongo_python/bin/activate
(mongo_python)$ cd ~/mongo_python/source/
(mongo_python)$ vi upsert.py
[/shell] [python title=”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)

[/python] [shell title=”データの生成”] (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’)}
[/shell]

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

[python title=”編集した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)])

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)

[/python]

実行してみる。

[shell] (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’)} <- データが挿入されている。
[/shell]

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

[python title=”再度編集した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)])

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)

[/python]

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

[shell] (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}
[/shell]

 

Related posts

コメントを残す