2016-11-07 64 views
4

我想更新文檔,如果它存在並插入,如果它不存在集合中。我將熊貓數據幀記錄作爲文檔插入,基於_id。新文檔的插入工作正常,但舊文檔中的字段更新不起作用。批量upsert不工作pymongo

bulk = pymongo.bulk.BulkOperationBuilder(pros_rides,ordered=False) 
for doc in bookings_df: 
    bulk.find({ "_id": doc["_id"] }).upsert().update({ 
     "$setOnInsert": doc 
    }) 
response = bulk.execute() 

我錯過了什麼?

+0

你是什麼*不工作意味着*? – styvane

+0

@Styvane在做upsert的時候,當新的記錄到來時它會插入,但是當舊記錄到來時文檔沒有被更新。 –

回答

5

一個upsert可以更新或插入文檔; 「$ setOnInsert」操作僅在文檔被插入時執行,而不是。如果文檔存在,爲了更新文檔,您必須提供一些在文檔更新時將執行的操作。

嘗試這樣的事情,而不是:

bulk = pros_rides.initialize_unordered_bulk_op() 
for doc in books_df: 
    bulk.find({'_id': doc['_id']}).upsert().replace_one(doc) 

bulk.execute() 
+0

@Deepak selva,請注意['Bulk()'](https://docs.mongodb.com/manual/release-notes/3.2/#mongo-shell-and-crud-api)及其關聯的方法已棄用在MongoDB 3.2中提供['bulk_write()'](http://api.mongodb.com/python/current/api/pymongo/collection.html#pymongo.collection.Collection.bulk_write)方法 – styvane

+0

@ Deepak- selva還有什麼我可以幫助你的,或者你會接受這個答案是否正確? –

+0

@ A.JesseJiryuDavis謝謝男人..這節省了我的時間。 –