web-dev-qa-db-ja.com

Python-Pymongo Insert and Update Documents

PyMongoを使用して、MongoDBに送信したいリストに一連のdictがあります。リストの一部の項目は新しいエントリであり、一部は更新されます。

例:

サーバーデータベース:

[{"_id" : 1, "foo" : "bar}]

データベースに送信するには:

[{"_id" : 1, "foo" : "HELLO"}, {"_id" : 2, "Blah" : "Bloh"}]

現在、以下を使用してドキュメントを挿入していますが、上記のようにするにはどうすればよいですか?どんな助けでもありがたいです!

collection.insert(myDict)
14
Dustin

upsertオプションを使用:

from pymongo import MongoClient
cl = MongoClient()
coll = cl["local"]["test2"]

data = [{"_id" : 1, "foo" : "HELLO"}, {"_id" : 2, "Blah" : "Bloh"}]
for d in data:
    coll.update({'_id':d['_id']}, d, True)
21
Roman Pekar

save も使用できます

import pymongo
con = pymongo.MongoClient()
coll = con.db_name.collection_name

docs = [{"_id" : 1, "foo" : "HELLO"}, {"_id" : 2, "Blah" : "Bloh"}]

for doc in docs:
    coll.save(doc)
7
lovesh

データを更新(または挿入)するには、upsertを使用する必要があります

from pymongo import MongoClient
client = MongoClient()
collection = client.my_database.my_collection

objects = [{"_id" : 1, "foo" : "HELLO"}, {"_id" : 2, "Blah" : "Bloh"}]
for obj in objects:
     collection.replace_one({"_id": obj["_id"]}, obj, upsert=True) 

使用する replace_oneupdateメソッドとして 非推奨

https://api.mongodb.com/python/current/api/pymongo/collection.html#pymongo.collection.Collection.replace_one

一括更新を使用する場合:

from pymongo import ReplaceOne

update_objects = list()
for obj in objects:
    update_objects.append(ReplaceOne( {'_id': obj['_id']},  obj, upsert=True))

collection.bulk_write(update_objects)
1

Pymongo 3.0以降の場合:

import pymongo
con = pymongo.MongoClient()
collection = con.db_name.collection_name

docs = [{"_id" : 1, "foo" : "HELLO"}, {"_id" : 2, "Blah" : "Bloh"}]
for d in docs:
    collection.update_many({'_id':d['_id']}, d,True)

参照: http://api.mongodb.org/python/current/api/pymongo/collection.html

1
TheMI