Mongodb 复杂序列生成和存储模式

Mongodb 复杂序列生成和存储模式,mongodb,schema,mongoose,Mongodb,Schema,Mongoose,我有一个数据库和一个客户表。这些客户是企业,我正试图设计一种灵活、可靠的方式,允许客户设计自己的自定义发票号码 例如: invoice_format: "A-{YY}{seq-04.d}" 客户A发票序列:A-1306-1234,其中“A-”为静态文本,1306为YYMM,1234为每月重置的序列 客户B发票序列:123456-这是一个永远计数的序列 客户C发票序列:13-123456-此序列具有YY-然后序列运行一年并重置 我正试图决定哪种最灵活的方式允许任意序列成为这个数字的一部分。我

我有一个数据库和一个客户表。这些客户是企业,我正试图设计一种灵活、可靠的方式,允许客户设计自己的自定义发票号码

例如:

invoice_format: "A-{YY}{seq-04.d}"
  • 客户A发票序列:A-1306-1234,其中“A-”为静态文本,1306为YYMM,1234为每月重置的序列
  • 客户B发票序列:123456-这是一个永远计数的序列
  • 客户C发票序列:13-123456-此序列具有YY-然后序列运行一年并重置
我正试图决定哪种最灵活的方式允许任意序列成为这个数字的一部分。我还需要以原子方式生成这个数字,并根据单个元素施加的固有规则处理序列的重置,例如序列中的MM推断每个月都会重新启动纯增量元素,其中MMDD推断每天都会重新启动纯增量元素


自定义类型是否正确?一组getter和setter以及static、方法和验证器?这类功能已经有了设计模式吗?

我必须解决一个类似于客户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更新序列。 这个操作是原子的,因为我使用

这是我获取序列下一个值的代码(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();
    }
我在生产环境中运行了这段代码,到目前为止我还没有遇到任何问题。但为了以防万一,我在accounts集合的“pin”字段中放置了一个唯一的索引,因此如果存在重复,我将捕获异常并使用新的pin重试几次

有关如何实现这一点的更多信息,请查看此

对于其他情况,可以使用存储在mongoDB中的javascript函数将该逻辑应用于序列。看看这个,虽然现在有一条消息说他们不推荐它(这条消息是新的…),但它可以给你更多的想法


希望这有帮助

我已经用一个比我开始寻找的简单得多的解决方案实现了我的目标。在每个代理记录中,我创建了一个名为
invoice\u format
的字符串字段。在这个字段中,我存储一个格式字符串,通过解析该字符串生成发票号。例如:

invoice_format: "A-{YY}{seq-04.d}"

我解析它,{}内的任何内容都被视为格式化规则,{}外的任何内容都被视为文本。我有一个不太吸引人的开关,它查找每个格式规则并根据规则返回一个值。我还有工作要做,但这是我的序列生成器的基础。每个客户的顺序都保存在一个单独的字段中,称为invoice_sequence,当我在字段中遇到{seq}时,我会增加此字段并返回结果。

感谢链接。由于输入将由用户输入,因此eval()将退出,除非我对输入进行严格筛选,或者强制用户使用某种UI来构建格式srting。