直接查询集合将只解决你的问题的一部分。
从外观上看,您使用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
第一次运行以确保任何特殊字符都能正确转义。
请注意,这不是一个快速查询,特别是如果您的数据库中有很多会话。
编辑:我刚刚发现了stringify
选项connect-mongo
,如果设置为false
,应该写会话数据作为常规对象的MongoDB,而不是作为一个JSON字符串。
可能的重复http://stackoverflow.com/a/10519504/3284355请参阅编辑正确的答案。您可以使用mongo本机驱动程序包,因为它已经安装了 – Molda