我在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.
这个问题的解决方案是什么?
3条答案
按热度按时间fae0ux8s1#
CosmosDB是一个不同于MongoDB的服务器实现,一些特性和行为不同。
Cosmos目前仅支持Cosmos内部修改时间戳字段
_ts
上的TTL索引:_ts是Cosmos DB特定的字段,无法从MongoDB客户端访问。它是一个保留的(系统)属性,包含文档最后一次修改的时间戳。
由于
connect-mongo
使用一个名为expires
的字段作为ttl
的值,因此默认情况下它不能与Cosmos一起使用。但是,你可以通过使用
connect-mongo
的兼容模式来解决这个问题,该模式在Node应用程序中使用一种效率较低的基于计时器的方法,而不是MongoDB服务器支持的原生TTL索引:您可以使用
autoRemoveInterval
选项调整计时器间隔,该选项设置运行查询以删除过期文档的频率。yyhrrdl82#
要在架构上创建集合级ttl,请用途:
pvabu6sv3#
自MS Build 2023起,Cosmos Mongo API supports
绝对路径TTL(MongoDB API):现在在GA中,此功能使Azure Cosmos DB for MongoDB能够在任何日期字段上创建生存时间索引,从而为用户提供更大的灵活性来确定其文档何时到期。
因此,您不再局限于必须在
_ts
字段上创建它。