Mongoose从没有模型的集合中删除

时间:2016-06-25 04:05:35

标签: node.js mongodb mongoose

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

1 个答案:

答案 0 :(得分:2)

直接查询集合只能解决部分问题。

从它的外观来看,您使用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之类的内容,可能是最好的,以确保正确转义任何特殊字符。

请注意,这不是一个快速查询,特别是如果您的数据库中有很多会话。

编辑:我刚刚找到connect-mongo的{​​{3}}选项,如果设置为false,则应将会话数据作为常规对象写入MongoDB ,而不是作为JSON字符串。