87

ドキュメントを挿入するとします。

post = { some dictionary }
mongo_id = mycollection.insert(post)

ここで、フィールドを追加して更新したいとします。それ、どうやったら出来るの?これはうまくいかないようです.....

post = mycollection.find_one({"_id":mongo_id}) 
post['newfield'] = "abc"
mycollection.save(post)
4

5 に答える 5

116

pymongo では次のように更新できます:
mycollection.update({'_id':mongo_id}, {"$set": post}, upsert=False)
投稿がデータベースに見つからない場合、更新の代わりに Upsert パラメータが挿入されます。
ドキュメントはmongodb サイトで入手できます。

UPDATEバージョン > 3の場合、 updateの代わりにupdate_oneを使用します。

mycollection.update_one({'_id':mongo_id}, {"$set": post}, upsert=False)

于 2010-12-07T07:32:39.557 に答える
22

私はcollection.save(the_changed_dict)このように使用します。私はこれをテストしたばかりですが、それでも機能します。以下はから直接引用されていpymongo doc.ます:

save(to_save[, manipulate=True[, safe=False[, **kwargs]]])

このコレクションにドキュメントを保存します。

to_saveにすでに「_id」がある場合は、update()(upsert)操作が実行され、その「_id」を持つ既存のドキュメントが上書きされます。それ以外の場合は、insert()操作が実行されます。この場合、manipulateがTrueの場合、「_ id」がto_saveに追加され、このメソッドは保存されたドキュメントの「_id」を返します。操作がFalseの場合、「_ id」はサーバーによって追加されますが、このメソッドはNoneを返します。

于 2012-08-14T08:32:42.827 に答える
12

Insert a Document (insert is deprecated)というタイトルの PyMongo に関する最新のドキュメントと次の防御的なアプローチによると、次のように挿入して更新する必要があります。

result = mycollection.insert_one(post)
post = mycollection.find_one({'_id': result.inserted_id})

if post is not None:
    post['newfield'] = "abc"
    mycollection.save(post)
于 2016-12-04T12:34:19.817 に答える
10

これは古い質問ですが、回答を探しているときにこれに出くわしたので、参考のために回答を更新したいと思いました。

メソッドsaveおよびupdateは非推奨です。

save(to_save, manage=True, check_keys=True, **kwargs)¶ ドキュメントをこのコレクションに保存します。

非推奨 - 代わりに insert_one() または replace_one() を使用してください。

バージョン 3.0 で変更: safe パラメータを削除しました。未確認の書き込み操作には w=0 を渡します。

update(spec, document, upsert=False, manage=False, multi=False, check_keys=True, **kwargs) このコレクション内のドキュメントを更新します。

非推奨 - 代わりに、replace_one()、update_one()、または update_many() を使用してください。

バージョン 3.0 で変更: safe パラメータを削除しました。未確認の書き込み操作には w=0 を渡します。

OP の特定のケースでは、 を使用することをお勧めしますreplace_one

于 2015-08-20T20:47:39.250 に答える