node.js - Mongoose 从没有模型的集合中删除

标签 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});
});

尽管我收到了错误:无法读取未定义的属性“删除”

最佳答案

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

从表面上看,您正在使用 express-sessionconnect-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/

相关文章:

javascript - RingCentral JS SDK - 缺少刷新 token

JavaScript:在服务器端和客户端执行的 DOM 相关代码的最佳实践?

mysql - 使用运算符IN的Golang MongoDB更新查询

javascript - 如何关闭 Mongoose 中的 strictpopulate?

javascript - 带有 express : Why my middleware is executing twice Here is the code 的 Nodejs

javascript - 如何使用javascript在客户端通过串口进行通信?

node.js - 为什么我的 React.js 应用程序中会出现此错误 'You need to enable javascript'?

javascript - Mongo/Mongoose - markModified 不起作用

node.js - 在 Windows 7 上 npm install mongoose 失败

javascript - Mongoose 字段不是必需的但唯一的