Mongoose – 通过findOne()search模式失败

在通过MongoDB设置一个sessionStore来进行express-session ,我使用findOne()函数来validation用户的信息是否有效和最近有点麻烦。

 var session = require('express-session'); var mongoStore = require('connect-mongo')(session); var mongoose = require('mongoose'); var Schema = mongoose.Schema; var Session = mongoose.model('session', new Schema({ sid : String, username : String, email : String })); ... 

诀窍是, express-sessionconnect-mongo负责pipe理对数据库的写操作。

 app.use(session({ secret: 'secretsquirrel', resave: true, saveUninitialized: true, store: new mongoStore({ mongoseConnection: mongoose.connection, host: '127.0.0.1', port: '27017', db: 'testdb', collection: 'collectionName' }) })); 

现在,这似乎正在工作,因为文件被input到我指定的集合中。 从集合中返回数据产生以下内容:

 { "_id":"sdBYsdflAsdfyWPPneV-hrC2xsXP", "session":" { \"cookie\": { \"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\" }, \"email\":\"testuser@email.com\", \"username\":\"testuser\", \"sid\":\"f59106e845e11df8c3413b5f1f80ee01e876526bc3c0d05\", }", "expires": ISODate(DateHere) } 

在问题似乎是在数据库中,或通过Mongoose,似乎并不重要,我试图查询SID,我没有返回任何结果使用以下任何:

通过Mongo:

 db.collectionName.findOne({ session.sid: "sid" }) db.collectionName.findOne({ "session.sid": "sid" }) db.collectionName.findOne({ "session": { "\"sid\"": "sid" } }) 

通过mongoose(NodeJS)

 Session.findOne({ sid: req.session.sid }, function(err, data) {...}); Session.findOne({ "sid": req.session.sid }, function(err, data) {...}); Session.findOne({ "\"sid"\"": "\"" + req.session.sid + "\"" }, function(err, data) {...}); 

这个stumper是,在这两个例子中,我怎么能返回我已经validation过的数据呢? 我是否需要考虑文档中返回的转义报价,或者仅仅是通过mongo shell输出?

有没有什么步骤,我失踪,正确地search这些数据? 一个新的眼睛将不胜感激!

解:

vinagreti指出,保存到我的集合的数据不是对象,而是明文。

通过引用connect-mongo的文档 , stringify有一个额外的选项。 此设置会将会话中保存的数据串化并数据库化。 考虑到express-session已经产生了一个JSON对象,使用stringify()使它在集合中是不可测量的。

所有需要的是添加stringify: false到我的mongoStore设置如下所示:

 store: new mongoStore({ mongoseConnection: mongoose.connection, host: '127.0.0.1', port: '27017', db: 'testdb', collection: 'collectionName', stringify: false }) 

然后瞧! 保存到集合中的所有东西现在都是可以search的对象! 感谢vinagreti帮忙指出问题! 请upvote他的答案!

您将会话对象保存为纯文本 。 因为你不能作为一个对象search。

确保“父”集合的模式具有types为“{}”(Object)的会话字段:Father = {session:{ type:{} }}

如果不起作用,可以尝试下面的内容:

您可以更改保存会话对象的方式, 将其保存为对象而不是纯文本。

或者,您可以使用正则expression式search会话,试图在会话字段中findsid ,如:

 db.user.findOne({session: /.*f59106e845e11df8c3413b5f1f80ee01e876526bc3c0d05.*/});