NodeJS “仅'_ts'字段支持'expireAfterSeconds'选项,“显示错误

20jt8wwn  于 2023-06-05  发布在  Node.js
关注(0)|答案(3)|浏览(408)

我在node.js中使用cosmos db作为会话存储。Cosmos DB版本是3.6。
我执行以下代码。

const expressSession = require("express-session");
const MongoStore = require("connect-mongo")(expressSession);
const store = new MongoStore({
        mongooseConnection: mongoose.connection,
        ttl:24 * 60 * 60 * 1000,
})

结果显示以下消息。

(node:16068) UnhandledPromiseRejectionWarning: MongoError: The 'expireAfterSeconds' option is supported on '_ts' field only.

这个问题的解决方案是什么?

fae0ux8s

fae0ux8s1#

CosmosDB是一个不同于MongoDB的服务器实现,一些特性和行为不同。
Cosmos目前仅支持Cosmos内部修改时间戳字段_ts上的TTL索引:

_ts是Cosmos DB特定的字段,无法从MongoDB客户端访问。它是一个保留的(系统)属性,包含文档最后一次修改的时间戳。

由于connect-mongo使用一个名为expires的字段作为ttl的值,因此默认情况下它不能与Cosmos一起使用。
但是,你可以通过使用connect-mongo的兼容模式来解决这个问题,该模式在Node应用程序中使用一种效率较低的基于计时器的方法,而不是MongoDB服务器支持的原生TTL索引:

const store = new MongoStore({
        mongooseConnection: mongoose.connection,
        ttl:24 * 60 * 60 * 1000,
        autoRemove: 'interval',
        autoRemoveInterval: 10 // Value in minutes (default is 10)
})

您可以使用autoRemoveInterval选项调整计时器间隔,该选项设置运行查询以删除过期文档的频率。

yyhrrdl8

yyhrrdl82#

要在架构上创建集合级ttl,请用途:

schema.index({ _ts: 1 }, { expireAfterSeconds: 60 });
pvabu6sv

pvabu6sv3#

自MS Build 2023起,Cosmos Mongo API supports

绝对路径TTL(MongoDB API):现在在GA中,此功能使Azure Cosmos DB for MongoDB能够在任何日期字段上创建生存时间索引,从而为用户提供更大的灵活性来确定其文档何时到期。

因此,您不再局限于必须在_ts字段上创建它。

相关问题