我不得不解決類似你的情況爲客戶B. 我解決了一個問題:我創建了一個集合來存儲序列,並添加像這樣的文件:
{
"_id" : "PIN",
"_class" : "com.alldata.genIII.bo.Sequence",
"description" : "Sequence for PIN numbers. Used in all Account collections. ",
"nextValue" : NumberLong(100001)
}
我使用_id指定將使用該序列的帳戶集合中的字段。我從100001開始爲用戶提供需求。
當創建帳戶時,我獲取序列的下一個值並將序列更新爲1. 此操作是原子的,因爲我使用findAndModify。
這是我的代碼(Java)來獲取序列的下一個值:
public Long fetchNextValue(String sequenceId) {
Update update = new Update();
update.inc("nextValue", 1);
Sequence seq = mongoTemplate.findAndModify(new Query(Criteria.where("code").is(sequenceId)), update, Sequence.class);
if (seq == null)
throw new NotFoundException("Sequence not found for sequenceId " + sequenceId);
return seq.getNextValue();
}
我有這樣的代碼運行在生產,到目前爲止,我還沒有遇到問題。但爲防萬一,我在帳戶集合的「pin」字段中添加了一個唯一的索引,所以如果有重複的情況,我會捕獲異常並重新嘗試幾次,並使用新的引腳。
有關如何做到這一點看看這article
您的其他案件的詳細信息,您可以使用存儲在MongoDB的一個JavaScript函數,該邏輯也適用於該序列。看看這個article,雖然現在有一條消息說他們不推薦它(這個消息是新的......),但它可以給你更多的想法。
希望這有助於
感謝您的聯繫。由於輸入將是用戶輸入的,除非我對輸入做了一些嚴格的過濾,或者強制用戶給我們某種UI來構建格式srting,否則eval()將不會出現。 – regretoverflow