【问题标题】:Mongoose remove from collection without model猫鼬从没有模型的集合中移除
【发布时间】:2016-10-27 17:57:57
【问题描述】:

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

【问题讨论】:

标签: node.js mongodb mongoose


【解决方案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,以确保所有特殊字符都被正确转义。

请注意,这不是一个快速查询,尤其是当您的数据库中有很多会话时。

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

【讨论】:

  • 你的假设是正确的。我正在使用express-sessionconnect-mongo 来管理我的会话。在我的注销 API 的 POST 上,我需要销毁这些会话。我设法通过在我的 API 中调用 req.session = null 并在我的会话设置中设置 unset: 'destroy' 来做到这一点。虽然,有一个小问题;如果 req.session.userId 未定义,我的主页 (app.get('/',...)) 会提供不同的页面。出于某种原因,我需要在调用注销 API 后刷新我的页面两次才能取消设置。
  • @Fizzix 如果在请求注销路由后属于会话密钥的会话已被删除,您能否检查数据库?或者如果req.session.destroy() 效果更好?
猜你喜欢
  • 2012-09-20
  • 1970-01-01
  • 2013-05-19
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
  • 1970-01-01
  • 2016-07-15
  • 2023-03-09
相关资源
最近更新 更多