MongoDB(18) - 更新編 (データがない場合は登録/データがある場合は更新)

MongoDBでは、updateとinsertを合わせた処理としてupsertという処理ができます。

検索条件に一致した場合はupdateを行い、一致しない場合はinsertを行います。

サンプルデータ

次のようなデータをcol1コレクションに設定します。

[Mongoシェル]

1
2
3
4
5
6
7
8
> db.col1.insertOne({name:"白石", age:29})
{
"acknowledged" : true,
"insertedId" : ObjectId("612c0e58381137ed71b344c5")
}

> db.col1.find()
{ "_id" : ObjectId("612c0e58381137ed71b344c5"), "name" : "白石", "age" : 29 }

upsertで更新

updateOne、updateManyの第3引数に{upsert:true}を指定すると、upsert処理が実行できます。

まずは、upsert処理でデータを更新してみます。

[Mongoシェル]

1
2
3
4
5
> db.col1.updateOne({name:"白石"}, {$set:{sex:"女"}}, {upsert:true})
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }

> db.col1.find()
{ "_id" : ObjectId("612c0e58381137ed71b344c5"), "name" : "白石", "age" : 29, "sex" : "女" }

検索条件に合致するドキュメントがあったので、そのデータにsexフィールドが追加されました。

upsertで追加

次に、upsert処理でデータを追加してみます。

[Mongoシェル]

1
2
3
4
5
6
7
8
9
10
11
> db.col1.updateOne({name:"高山"}, {$set:{sex:"男"}}, {upsert:true})
{
"acknowledged" : true,
"matchedCount" : 0,
"modifiedCount" : 0,
"upsertedId" : ObjectId("612c0ea8d7d19d218ba03157")
}

> db.col1.find()
{ "_id" : ObjectId("612c0e58381137ed71b344c5"), "name" : "白石", "age" : 29, "sex" : "女" }
{ "_id" : ObjectId("612c0ea8d7d19d218ba03157"), "name" : "高山", "sex" : "男" }

nameが”高山”のドキュメントがなかったので、新しいドキュメントが追加されました。

upsertで追加されるデータは、検索条件と更新内容に指定したフィールドのみとなります。

Pythonで操作

上記の更新処理をPythonで行うと、次のようになります。

(upsertの指定の仕方にご注意ください。)

[ソースコード]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import pymongo
from pymongo import MongoClient

# MongoDB操作用のインスタンスを作成
client = MongoClient() # [IPとポートを指定する場合] MongoClient('10.200.243.203', 27017')

# データベースの取得
db1 = client.db1

# upsertで更新
db1.col1.update_one({'name':'白石'}, {'$set':{'sex':'女'}}, upsert=True)

# 結果表示
for doc in db1.col1.find():
print(doc)

# upsertで追加
db1.col1.update_one({'name':'高山'}, {'$set':{'sex':'男'}}, upsert=True)

# 結果表示
for doc in db1.col1.find():
print(doc)

次回は、ドキュメントの削除を行います。