2015-12-31 33 views
0

在mongodb中,我有一個字段必須是從0到MAX(整數最終變量)。 每個值命中MAX時它必須返回0。 執行此我想這(JAVA):java mongodb - 只有在範圍內才設置字段

Document document = coll.findOneAndUpdate(
    filter, 
    new Document(//update 
     "$inc", 
     new Document("counter", 1) 
    ) 
); 
int count = (document != null) ? document.getInteger("counter") : 0; 
if(count >= MAX) { 
    count-= MAX; 
    coll.updateOne(filter, new Document("$set", new Document("counter", count)); 
} 

唯一的問題是,這是不同步的,並可能導致櫃檯失去一些計數如果多個客戶端在同一時間訪問它。爲了使這個同步,我必須測試count是在從countmax範圍之前設置它,我怎麼能做到這一點?

+0

您可以將代碼片段放入同步塊中。但它嚴重影響性能。 – harshavmb

+0

這不僅僅是性能,它不會是多個機器的原子 – SnowyCoder

回答

0

您可以執行兩個請求:將計數器重置爲0,它等於MAX。然後增加一個計數器。所有這些都使用了mongodb機制,例如findAndModify,它保證了原子性!

+0

稍微改進使用較少的請求:我可以將計數器設置爲1,不發送增量。 – SnowyCoder