2016-06-25 51 views
0

我的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

可能的重复http://stackoverflow.com/a/10519504/3284355请参阅编辑正确的答案。您可以使用mongo本机驱动程序包,因为它已经安装了 – Molda

回答

1

直接查询集合将只解决你的问题的一部分。

从外观上看,您使用express-sessionconnect-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字符串。

+0

您的假设是正确的。我正在使用'connect-mongo'的'express-session'来管理我的会话。在我的注销API的'POST'中,我需要销毁这些会话。我已经设法通过在我的API中调用'req.session = null'并在我的会话设置中设置'unset:'destroy''来实现。虽然有一个小问题,如果'req.session.userId'不是未定义的,我的主页('app.get('/',...)')会提供一个不同的页面。出于某种原因,我需要在注销API之后重新刷新页面两次以使其未被设置。 – Fizzix

+0

@Fizzix可以在数据库中检查属于会话密钥的会话是否已经在注销路由请求后被删除?或者,如果'req.session.destroy()'可以更好地工作? – robertklep