一种使一个集合中的特定文档过期并在到期时将其添加到另一个集合的好方法

mutmk8jj  于 2022-10-04  发布在  Go
关注(0)|答案(2)|浏览(85)

我使用的是NodeJS和MongoDB驱动。

两部分问题

1.我有一个名为openOffers的集合,我想在达到时间closeOfferAt时终止它。我知道MongoDB提供了TTL、expireAtexpireAfterSeconds。但是,当我使用它们时,相同的TTL应用于特定集合中的所有文档。我不确定我这样做是否正确。我希望文档级自定义过期。任何语法都可能非常有用!openOffers中的文档

{
 "_id":"12345",
 "data": {...},
 "closeOfferAt" : "2022-02-21T23:22:34.023Z"
}

1.我想将这些过期文档推送到另一个集合openOfferLog。这是为了我可以保留文档以供以后分析。

当前方法:我还没有想出办法在openOffers中的每个文档上都有一个定制的TTL。但是,我目前将文档同时插入到openOffersopenOffersLog中,openOffers中的任何数据更改都必须单独传播到openOffersLog以确保一致性。我想,一定有一种更好的可伸缩性方法。

EDIT-1:

我正在寻找一些可以用于上述用例的语法逻辑。如果不能使用当前的MongoDB驱动程序,我正在寻找一种使用NodeJS代码的替代解决方案,我可以尝试一下。我对NodeJS和MongoDB都是新手--所以任何支持该解决方案的理由都会非常有用。

mrphzbgm

mrphzbgm1#

有两种方法可以实现TTL索引。

*一定时间后删除-这是您已经实施的

  • 在特定的时钟时间删除-详细答案可访问MongoDB文档

因此,第二种选择满足了您的期望,

1.创建索引时,只需在expireAfterSeconds字段中设置0(零)即可。

db.collection.createIndex({ "closeOfferAt": 1 }, { expireAfterSeconds: 0 })

1.插入文档时,只需在closeOfferAt中设置到期日期,即可删除特定时间戳的文档。

db.collection.insert({
    "_id":"12345",
    "data": {...},
    "closeOfferAt" : ISODate("2022-02-23T06:14:15.840Z")
})
vu8f3i0k

vu8f3i0k2#

不要使您的应用程序逻辑依赖于TTL索引。

在你的应用程序中,你应该有一些运行定期任务的调度程序,其中一些会将完成的报价移到其他集合中,并从原始报价中删除,即使是批量删除,也不需要设置TTL索引。

为了保持一致性,没有什么比单一的真理来源更好的了,所以如果可以的话,避免删除,只更改一些状态标志和时间戳。

TTL索引的一个很好的用途是在相对较长的时间(如一个月或更长时间)后自动清除旧数据。这可以控制集合/索引的大小。

相关问题