MongoDB(14) - 更新編

今回からは、MongoDBの更新に関する動作を確認していきます。

サンプルデータ

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

[Mongoシェル]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
> db.col1.insertOne({name:'高山', age:20})
{
"acknowledged" : true,
"insertedId" : ObjectId("6126f663f49ea66243206a1b")
}

> db.col1.insertOne({name:'生田', age:11})
{
"acknowledged" : true,
"insertedId" : ObjectId("6126f663f49ea66243206a1c")
}

> db.col1.insertOne({name:'菅井', age:34})
{
"acknowledged" : true,
"insertedId" : ObjectId("6126f663f49ea66243206a1d")
}

> db.col1.find()
{ "_id" : ObjectId("6126f663f49ea66243206a1b"), "name" : "高山", "age" : 20 }
{ "_id" : ObjectId("6126f663f49ea66243206a1c"), "name" : "生田", "age" : 11 }
{ "_id" : ObjectId("6126f663f49ea66243206a1d"), "name" : "菅井", "age" : 34 }

1件更新

ドキュメントを1件更新する場合は、updateOneを使います。

第1引数には検索条件を指定し、第2引数には$setを使い更新内容を設定します。

[Mongoシェル]

1
2
3
4
5
6
7
> db.col1.updateOne({name:"高山"}, {$set:{age:21}})
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }

> db.col1.find()
{ "_id" : ObjectId("6126f663f49ea66243206a1b"), "name" : "高山", "age" : 21 }
{ "_id" : ObjectId("6126f663f49ea66243206a1c"), "name" : "生田", "age" : 11 }
{ "_id" : ObjectId("6126f663f49ea66243206a1d"), "name" : "菅井", "age" : 34 }

nameが“高山”のドキュメントに関して、ageを21に更新しました。

updateOneでは、検索条件に一致するデータが複数あっても、1件しか更新されません。

複数件更新

ドキュメントを複数更新する場合は、updateManyを使います。

第1引数には検索条件を指定し、第2引数には$setを使い更新内容を設定します。

[Mongoシェル]

1
2
3
4
5
6
7
> db.col1.updateMany({}, {$set:{age:50}})
{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }

> db.col1.find()
{ "_id" : ObjectId("6126f663f49ea66243206a1b"), "name" : "高山", "age" : 50 }
{ "_id" : ObjectId("6126f663f49ea66243206a1c"), "name" : "生田", "age" : 50 }
{ "_id" : ObjectId("6126f663f49ea66243206a1d"), "name" : "菅井", "age" : 50 }

全てのドキュメントに対して、ageを50に変更しました。

検索条件になにも設定しないと、全てのドキュメントが更新されます。

Pythonで操作

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

[ソースコード]

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

# 1件更新
db1.col1.update_one({'name':'高山'}, {'$set':{'age':21}})

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

# 複数件更新
db1.col1.update_many({}, {'$set':{'age':50}})

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

次回は、ドキュメントの入れ替えとフィールドの追加を行います。