我的MongoDB有一个由模块创建的sessions
集合。该集合没有任何模型或任何东西,因为它不是由Mongoose创建的。
如何在不指定该模型的情况下访问此集合?
我尝试了以下内容:
mongoose.connection.db.sessions.remove({'session.userId': userId}, function(e, found) {
console.log(found);
res.json({success: true});
});
虽然我收到了错误:Cannot read property 'remove' of undefined
答案 0 :(得分:2)
直接查询集合只能解决部分问题。
从它的外观来看,您使用express-session
和connect-mongo
来管理会话。这会将会话数据(req.session
)存储为数据库中的JSON 字符串:
{
"_id": "fLBj_McMFM-7PwVNsv9ov88vOAgoNiDa",
"session": "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"userId\":\"my-user-id\"}",
"expires": ISODate("2016-07-09T08:47:38.156Z")
}
如您所见,session
是一个字符串,而不是一个对象,因此您无法使用session.userId
直接查询它。
如果您不能使用req.session.destroy()
,则需要执行正则表达式查询以匹配JSON字符串中的用户ID:
let collection = mongoose.connection.db.collection('sessions');
let query = new RegExp(`"userId":"${userId}"`);
collection.remove({ session : query }, function(e, found) {
console.log(found);
res.json({success: true});
});
如果userId
首次运行escape-string-regexp
之类的内容,可能是最好的,以确保正确转义任何特殊字符。
请注意,这不是一个快速查询,特别是如果您的数据库中有很多会话。
编辑:我刚刚找到connect-mongo
的{{3}}选项,如果设置为false
,则应将会话数据作为常规对象写入MongoDB ,而不是作为JSON字符串。