我必须为客户 B 解决与您的情况类似的问题。我的解决方案:我创建了一个集合来存储序列并添加了如下文档:
{
"_id" : "PIN",
"_class" : "com.alldata.genIII.bo.Sequence",
"description" : "Sequence for PIN numbers. Used in all Account collections. ",
"nextValue" : NumberLong(100001)
}
我使用 _id 来指定 Account 集合中将使用该序列的字段。为了用户的需求,我从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”字段中放置了一个唯一索引,因此如果有重复,我会捕获异常并使用新的 pin 重试几次。
有关如何完成此操作的更多信息,请查看本文
对于其他情况,您可以使用存储在 mongoDB 中的 javascript 函数,将该逻辑应用于序列。看看这篇文章,虽然现在有一条消息说他们不推荐它(那条消息是新的......)但它可以给你更多的想法。
希望这可以帮助