Dustin
Dustin

Reputation: 6307

Python - Pymongo Insert and Update Documents

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

Answers (4)

roman
roman

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

Sebastien DA ROCHA
Sebastien DA ROCHA

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:

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

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

TheMI
TheMI

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

lovesh
lovesh

Reputation: 5411

You can also use 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)

Upvotes: 8

Related Questions