1

我正在尝试从 connect-mongo 会话集合中手动删除一个文档。当我尝试删除文档时,出现以下错误:

消息:'在路径“_id”处,值“gl9-V-bjAjqv2Nwdf9vHPLN_Fnnl4Thz”的值转换为 ObjectId 失败'

express-session 使用以下函数生成会话 id:

function generateSessionId(sess) {
 return uid(24);
}

从此函数生成的会话将进入会话文档的 _id 属性。但是,当您尝试通过生成的 id 查找或删除文档时,您会收到错误消息。

mongodb 文档说 _id 应该是

ObjectId 是一个 12 字节的 BSON 类型 ObjectId

我尝试使用会话上的 genid 选项覆盖会话 ID,但覆盖并没有使其进入数据库。

如何在文档中获取有效的 _id 或使用无效的 _id 查询文档?

谢谢!

我的基础架构:Express 4.10、Node v0.12.7、Compose.io、connect-mongo、express-session

4

1 回答 1

2

好的,所以您的问题是您用于从会话存储中删除文档的猫鼬模型。您可能应该调用req.session.destroy()或设置 TTL 来删除过期的会话。

但基本上,猫鼬希望该_id字段的“类型”是一个ObjectId“自动转换”。中间件本身不使用猫鼬mongo-connect方法,而是与底层驱动程序方法对话。所以它在使用它的内部方法时没有这个问题。

因此,您的猫鼬模式定义应如下所示:

var sessionSchema = new Schema({
    "_id": String,
    "session": String
},{ "_id" false });

或者至少包含{ "_id": false }以删除默认的自动转换行为。

于 2015-08-18T02:53:29.980 回答