MongoDB(16) - 更新編 (配列への要素追加 / オブジェクトへのフィールド追加)

今回は、配列への要素追加とオブジェクトへのフィールド追加を行います。

サンプルデータ

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

[Mongoシェル]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
> db.col1.insertOne({name:'高山',
age:20,
skill:['SQL', 'DB2', 'Oracle'],
child:[{name:'めい', age:7},
{name:'まい', age:5}]})
{
"acknowledged" : true,
"insertedId" : ObjectId("6129980b545059c91cb01b60")
}

> db.col1.find()
{ "_id" : ObjectId("6129980b545059c91cb01b60"),
"name" : "高山",
"age" : 20,
"skill" : [ "SQL", "DB2", "Oracle" ],
"child" : [ { "name" : "めい", "age" : 7 },
{ "name" : "まい", "age" : 5 } ] }

配列への要素追加

新しいスキル(skill)として”Python”を追加します。

“フィールド名.要素数”とすることで、配列の中の要素を更新することができます。

要素数は0から順番に指定します。

指定する番号の要素に値がある場合はその値を更新し、値がない場合は要素が追加されます。

[Mongoシェル]

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

> db.col1.find()
{ "_id" : ObjectId("6129980b545059c91cb01b60"),
"name" : "高山",
"age" : 20,
"skill" : [ "SQL", "DB2", "Oracle", null, "Python" ],
"child" : [ { "name" : "めい", "age" : 7 },
{ "name" : "まい", "age" : 5 } ] }

新しく要素を追加した結果、未設定の要素ができるとnullが設定されます。(上記の例では”skill”の0から数えて3番目の要素)

オブジェクトへのフィールド追加

childという配列の中の0番目のオブジェクトに、性別を追加します。

“フィールド名.要素数.フィールド名”とすることで、オブジェクトへフィールドを追加することができます。

[Mongoシェル]

1
2
3
4
5
6
7
8
9
10
> db.col1.updateOne({name:"高山"}, {$set:{"child.0.sex":"女"}})
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }

> db.col1.find()
{ "_id" : ObjectId("6129980b545059c91cb01b60"),
"name" : "高山",
"age" : 20,
"skill" : [ "SQL", "DB2", "Oracle", null, "Python" ],
"child" : [ { "name" : "めい", "age" : 7, "sex" : "女" },
{ "name" : "まい", "age" : 5 } ] }

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

# 配列への要素追加
db1.col1.update_one({'name':'高山'}, {'$set':{'skill.4':'Python'}})

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

# オブジェクトへのフィールド追加
db1.col1.update_one({'name':'高山'}, {'$set':{'child.0.sex':'女'}})

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

次回は、フィールド名の変更を行います。