2016-12-15 61 views
0

我有低於數據結構集合更新或創建如果不存在蒙戈3.0.4

{ "Shop": "123", "date": "28-05-2015", "Points": { "a": "1", "b": "2", "c": "3" } }

這裏店鋪和日期唯一索引,並且沒有id是存在的,除了_id, 所以,如果我想只更新b的值,如果記錄匹配(基於帳戶和日期)不存在,則應該創建與b的值具有相同結構的新記錄。 最重要的部分是它的批量操作意味着我需要每天爲所有商店創建/更新記錄,並且這些記錄將每天爲每個商店創建。因此,如果記錄不存在,則更新點,而不是創建它,更新現有記錄。我正在使用spring。 我嘗試使用upsert true進行更新,但它並未更新,而是僅更新值創建新記錄。並且更新多個商店並更新了最新點的最佳方法是什麼。

+0

你能在這裏發佈的更新插入代碼。 –

+0

我是在Mongo shell本身上做的。使用更新查詢與翻轉標誌作爲真...在mongo 3.4有更新中的$設置標誌正在工作,但它不是在3.0。意味着我會在幾個小時內更新代碼。 –

+0

我會添加一些示例代碼,您可以根據您的代碼對其進行驗證。 –

回答

0
//search a document that doesn't exist 
Query query = new Query(); 
query.addCriteria(Criteria.where("points.b").is("some value")); 

Update update = new Update(); 
update.set("b", some value); 
update.set..... //set all needed fields else they go as null 

mongoOperation.upsert(query, update, Shop.class); 

Shop shopTestObj = mongoOperation.findOne(query, Shop.class); 
System.out.println("shopTestObj - " + shopTestObj); 

在批量操作的情況下

// Sample code 
com.mongodb.DBCollection collection = db.getCollection("shop"); 

// Get BulkWriteOperation by accessing the mongodb com.mongodb.DBCollection class on mycol //Collection 

BulkWriteOperation bulkWriteOperation= collection.initializeUnorderedBulkOperation(); 

//perform the upsert operation in the loop to add objects for bulk execution 
for (int i=0;i<100;i++) 
{ 
// get a bulkWriteRequestBuilder by issuing find on the shop with _id 
BulkWriteRequestBuilder bulkWriteRequestBuilder=bulkWriteOperation.find(new BasicDBObject('_id',Integer.valueOf(i))); 

// get hold of upsert operation from bulkWriteRequestBuilder 
BulkUpdateRequestBuilder updateReq=    bulkWriteRequestBuilder?.upsert() 

updateReq. replaceOne (new BasicDBObject("_id",Integer.valueOf(i)).append("points.b", "some value")); 

} 
// execute bulk operation on shop collection 
BulkWriteResult result=bulkWriteOperation.execute(); 
+0

是否有任何理由使BulkWriteRequestBuilder基於_id或upsert是基於_id? –

+0

這只是一個例子。 –

+0

我沒有批量更新的上半部分。你可以解釋批量更新的一部分,如果我有一個對象的列表,並可以說店和日期是獨特的,所以我想UPOATE,B只比這將如何工作,而且你是使用BasicDBObject,我怎樣才能使用我的對象,而不是那 –