Reputation: 6307
Using PyMongo, I have a set of dict's in a list that I'd like to submit to my MongoDB. Some of the items in the list are new entries, and some are to update.
Example:
On Server Database:
[{"_id" : 1, "foo" : "bar}]
To send to database:
[{"_id" : 1, "foo" : "HELLO"}, {"_id" : 2, "Blah" : "Bloh"}]
I'm currently using the following to insert documents, but how would I do something like stated above? Any help is appreciated!
collection.insert(myDict)
Upvotes: 20
Views: 64146
Reputation: 117560
Use upsert
option:
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)
Upvotes: 30
Reputation: 472
You have to use the upsert
to update (or insert) your data
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)
Use replace_one
as the update
method is deprecated:
If you want to use bulk update:
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)
Upvotes: 8
Reputation: 1761
For pymongo 3.0 and later:
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)
Ref: http://api.mongodb.org/python/current/api/pymongo/collection.html
Upvotes: 5