chjuheng
chjuheng

Reputation: 21

mongodb update(use upsert=true) not update exists data, insert a new data?

in my program , ten process to write mongodb by update(key, doc, upsert=true)

the "key" is mongodb index, but is not unique.

query = {'hotelid':hotelid,"arrivedate":arrivedate,"leavedate":leavedate}

where = "data.%s" % sourceid
data_value_where = {where:value}
self.collection.update(query,{'$set':data_value_where},True)

the "query" id the not unique index

I found sometimes the update not update exists data, but create a new data.

I write a log for update method return, the return is " {u'ok': 1.0, u'err': None, u'upserted': ObjectId('5245378b4b184fbbbea3f790'), u'singleShard': u'rs1/192.168.0.21:10000,192.168.1.191:10000,192.168.1.192:10000,192.168.1.41:10000,192.168.1.113:10000', u'connectionId': 1894107, u'n': 1, u'updatedExisting': False, u'lastOp': 5928205554643107852L}"

I modify the update method to update(query, {'$set':data_value_where},upsert=True, safe=True), but three is no change for this question.

Upvotes: 0

Views: 903

Answers (2)

Sammaye
Sammaye

Reputation: 43884

You would not end up with duplicate documents due to the operator you are using. You are actually using an atomic operator to update.

Atomic (not to be confused with SQL atomic operations of all or nothing here) operations are done in sequence so each process will never pick up a stale document or be allowed to write two ids to the same array since the document each $set operation picks up will have the result of the last $set.

The fact that you did get duplicate documents most likely means you have an error in your code.

Upvotes: 0

justhalf
justhalf

Reputation: 9107

You can call it "threadsafe", as the update itself is not done in Python, it's in the mongodb, which is built to cater many requests at once.

So in summary: You can safely do that.

Upvotes: 0

Related Questions