我的 MongoDB 有一个由模块创建的 sessions
集合。该系列没有模型或任何东西,因为它不是由 Mongoose 创建的。
如何在不指定模型的情况下访问此集合?
我尝试了以下方法:
mongoose.connection.db.sessions.remove({'session.userId': userId}, function(e, found) {
console.log(found);
res.json({success: true});
});
尽管我收到了错误:无法读取未定义的属性“删除”
最佳答案
直接查询集合只能解决部分问题。
从表面上看,您正在使用 express-session
和 connect-mongo
来管理 session 。这会将 session 数据 (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
,这可能是最好的选择以确保所有特殊字符都正确转义。
请注意,这不是一个快速查询,尤其是当您的数据库中有大量 session 时。
编辑:我刚刚找到了 stringify
connect-mongo
的选项,如果设置为 false
,则应将 session 数据作为常规对象写入 MongoDB,而不是 JSON 字符串。
关于node.js - Mongoose 从没有模型的集合中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38024837/