首页 > 解决方案 > Mongoengine如何在新年后重置SequenceField?

问题描述

在我的模型中,我有一个 EmbeddedDocument Number,它具有一个序列字段(它不是主键),该字段用作字符串连接部分以生成论文标题(这样该字段确实需要是连续的,作为业务规则) .

规则是:当年份开始时,序号必须重新开始计数,重新从 1 开始计数。

前任:

...
12/30/2018 -> sequential_value = 545
12/30/2018 -> sequential_value = 546
12/31/2018 -> sequential_value = 547
01/01/2019 -> sequential_value = 1
01/01/2019 -> sequential_value = 2
...

我的模型: class Number(EmbeddedDocument): sequential_value = SequenceField(required=True)

我正在寻找是否有办法使用参数value_decorator来重新启动序列字段,因为它接受一个可调用的,但我还没有弄清楚。

标签: pythonmongodbmongoengine

解决方案


我通过改变我的方法解决了这个问题。看看 mongoengine 如何处理SequenceField

字段.py

counter = collection.find_and_modify(query={'_id': sequence_id},
                                         update={'$inc': {'next': 1}},
                                         new=True,
                                         upsert=True)

使用相同的方法,我创建了一个函数,它执行相同的操作,但使用 2 个 id 和年份作为查询 id:

next_number = collection.find_and_modify(
    query={'_id': oid+'_'+oeid+'_'+str(year)}, 
           update={'$inc': {'next': 1}},
           new=True,
           upsert=True)

所以......这样每次创建对象时,我都会使用此函数生成下一个序列号,并且当年份更改时会创建一个新行,因此序列号将再次从 1 开始。


推荐阅读