我使用的是NodeJS和MongoDB驱动。
两部分问题
1.我有一个名为openOffers
的集合,我想在达到时间closeOfferAt
时终止它。我知道MongoDB提供了TTL、expireAt
和expireAfterSeconds
。但是,当我使用它们时,相同的TTL应用于特定集合中的所有文档。我不确定我这样做是否正确。我希望文档级自定义过期。任何语法都可能非常有用!openOffers
中的文档
{
"_id":"12345",
"data": {...},
"closeOfferAt" : "2022-02-21T23:22:34.023Z"
}
1.我想将这些过期文档推送到另一个集合openOfferLog
。这是为了我可以保留文档以供以后分析。
当前方法:我还没有想出办法在openOffers
中的每个文档上都有一个定制的TTL。但是,我目前将文档同时插入到openOffers
和openOffersLog
中,openOffers
中的任何数据更改都必须单独传播到openOffersLog
以确保一致性。我想,一定有一种更好的可伸缩性方法。
EDIT-1:
我正在寻找一些可以用于上述用例的语法逻辑。如果不能使用当前的MongoDB驱动程序,我正在寻找一种使用NodeJS代码的替代解决方案,我可以尝试一下。我对NodeJS和MongoDB都是新手--所以任何支持该解决方案的理由都会非常有用。
2条答案
按热度按时间mrphzbgm1#
有两种方法可以实现TTL索引。
*一定时间后删除-这是您已经实施的
因此,第二种选择满足了您的期望,
1.创建索引时,只需在
expireAfterSeconds
字段中设置0
(零)即可。1.插入文档时,只需在
closeOfferAt
中设置到期日期,即可删除特定时间戳的文档。vu8f3i0k2#
不要使您的应用程序逻辑依赖于TTL索引。
在你的应用程序中,你应该有一些运行定期任务的调度程序,其中一些会将完成的报价移到其他集合中,并从原始报价中删除,即使是批量删除,也不需要设置TTL索引。
为了保持一致性,没有什么比单一的真理来源更好的了,所以如果可以的话,避免删除,只更改一些状态标志和时间戳。
TTL索引的一个很好的用途是在相对较长的时间(如一个月或更长时间)后自动清除旧数据。这可以控制集合/索引的大小。