Append item to MongoDB document array in PyMongo without re-insertion Append item to MongoDB document array in PyMongo without re-insertion python python

Append item to MongoDB document array in PyMongo without re-insertion


You don't need to use to retrieve the document first just use the .update method with the $push operator.

def update_tags(ref, new_tag):    coll.update({'ref': ref}, {'$push': {'tags': new_tag}})

Since update is deprecated you should use the find_one_and_update or the update_one method if you are using pymongo 2.9 or newer


Just to add to @ssytvane answer,and to answer @Guarav: you can add "upsert = True" if it does not exist:

def update_tags(ref, new_tag):    coll.update({'ref': ref}, {'$push': {'tags': new_tag}}, upsert = True)

or

def update_tags(ref, new_tag):    coll.update_one({'ref': ref}, {'$push': {'tags': new_tag}}, upsert = True)


You can simply do

1) If you want to append single entry

def update_tags(ref, new_tag):    coll.update({'ref': ref}, {'$push': {'tags': new_tag}})

eg:

{    "_id" : ObjectId("561c199e038e42b10956e3fc"),    "tags" : [ "tag1", "tag2", "tag3" ],    "ref" : "4780"}>> update_tags("4780", "tag4"){'updatedExisting': True, u'nModified': 1, u'ok': 1, u'n': 1}>> coll.find_one({"ref":"4780"}){    "_id" : ObjectId("561c199e038e42b10956e3fc"),    "tags" : [ "tag1", "tag2", "tag3" , "tag4" ],    "ref" : "4780"}

2) If you want to append multiple entries

def update_tags(ref, new_tag):    coll.update({'ref': ref}, {'$pushAll': {'tags': new_tag}}) #type of new_tag is list

eg:

{    "_id" : ObjectId("561c199e038e42b10956e3fc"),    "tags" : [ "tag1", "tag2", "tag3" ],    "ref" : "4780"}>> update_tags("4780", ["tag5", "tag6", "tag7"]){'updatedExisting': True, u'nModified': 1, u'ok': 1, u'n': 1}>> coll.find_one({"ref":"4780"}){    "_id" : ObjectId("561c199e038e42b10956e3fc"),    "tags" : [ "tag1", "tag2", "tag3" , "tag4" , "tag5", "tag6", "tag7" ],    "ref" : "4780"}

Note: If the key is not already present, then mongo will create new key.