33433


元のデータにこれらが入っているとします。

[code]

    usa1 = {1: 'Jay-Z', 2: 'Smap', 3: {'age': 20, 'tall': 144} }
    data = {'A': 'okada', 'B': 'satou', 'C': 'Yamane', 'D': usa1}
    db.student.insert(data)
    
[/code]

一部を変更します

[code]

    usa2 = {1: 'Jay-Z', 2: 'Smap', 3: {'age': 33, 'tall': 181} }
    data = {'A': 'okada', 'B': 'satou', 'C': 'Yamane', 'D': usa2}
    db.student.update(data)
    
[/code]

上記ではエラーになってしまうので、一度空の`student2`に`insert`して`student`を削除してから`student`に`insert`するということをやっているんですが、他にスマートな方法はありませんか？

[code]

    student2 = list(db.student.find())
    db.student.remove()
    db.student.insert(student2)
    
[/code]


CC BY-SA 3.0
2017-03-20T16:11:47.913
33432
2017-03-20T17:25:49.120
2017-03-20T17:05:24.527
7973
question
python python3 mongodb
Pymongoで丸ごとdictをアップデートしたいです。


コメントでは勘違いをしていたのですが、

[code]

    db.student.update({}, {$set: data})
    
[/code]

の場合、条件にマッチするドキュメント(RDB のレコードに相当)の内、`ObjectId`
が最小のものだけが更新されます(`updateOne()`と同等)。条件にマッチする全てのドキュメントを更新する場合は、`multi` パラメータを
`true` にセットするか、

[code]

    db.student.update({}, {$set: data}, {multi: true})
    
[/code]

`updateMany()` を使用します。

[code]

    db.student.updateMany({}, {$set: data})
    
[/code]

また、今回は `'D'` フィールドだけの変更ですので、

[code]

    db.student.update({}, {$set: {'D': usa2}})
    
[/code]

とする事もできます。この場合は他のフィールドは更新されず元のままとなります。


CC BY-SA 3.0
2017-03-20T17:25:49.120
33433
2017-03-20T17:25:49.120
33432
answer