Mongoose - 通过 findOne() 搜索架构失败
Mongoose - Searching Schema via findOne() unsuccessfully
在通过 MongoDB 为 express-session
设置 sessionStore 时,我在使用 findOne()
函数验证用户信息时遇到了一些问题有效且最近。
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-session
和 connect-mongo
负责管理对数据库的写入。
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'
})
}));
现在,这似乎可以正常工作,因为文档已输入到我指定的 collection 中。从 collection 返回数据会产生以下结果:
{
"_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 的方式似乎并不重要,我 return 使用没有结果以下任何一项:
通过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) {...});
问题是,在这两种情况下我都无法 return 我验证过的任何数据都在 collection 中,这是怎么回事?我是否需要像我一直试图做的那样考虑文档中的转义引号 return,或者只是通过 mongo shell?
输出
我是否缺少正确搜索此数据的任何步骤?不胜感激!
解法:
vinagreti 指出保存到我的 collection 的数据不是 Objects,而是相当明文。
参照connect-mongo's documentation,多了一个选项stringify
。此设置将 session 中保存的数据字符串化并序列化到数据库中。考虑到 express-session
已经产生 JSON object,使用 stringify()
使得它在 collection.
中不可搜索
只需将 stringify: false
添加到我的 mongo 商店设置中,如下所示:
store: new mongoStore({
mongoseConnection: mongoose.connection,
host: '127.0.0.1',
port: '27017',
db: 'testdb',
collection: 'collectionName',
stringify: false
})
然后瞧!保存到 collection 的所有内容现在都是 object 并且可以搜索!谢谢vinagreti 帮忙指出问题!请为他的回答点赞!
您将会话对象保存为纯文本。因此,您不能作为对象进行搜索。
确保 "father" 集合的架构将会话字段作为类型“{}”(对象),如:Father = {session: { type: {}}}
如果不行,您可以尝试以下方法:
您可以更改保存会话对象的方式,将其保存为对象而不是纯文本。
或者,您可以使用正则表达式搜索会话,尝试在会话字段中找到 sid,例如:
db.user.findOne({session: /.*f59106e845e11df8c3413b5f1f80ee01e876526bc3c0d05.*/});
在通过 MongoDB 为 express-session
设置 sessionStore 时,我在使用 findOne()
函数验证用户信息时遇到了一些问题有效且最近。
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-session
和 connect-mongo
负责管理对数据库的写入。
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'
})
}));
现在,这似乎可以正常工作,因为文档已输入到我指定的 collection 中。从 collection 返回数据会产生以下结果:
{
"_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 的方式似乎并不重要,我 return 使用没有结果以下任何一项:
通过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) {...});
问题是,在这两种情况下我都无法 return 我验证过的任何数据都在 collection 中,这是怎么回事?我是否需要像我一直试图做的那样考虑文档中的转义引号 return,或者只是通过 mongo shell?
输出我是否缺少正确搜索此数据的任何步骤?不胜感激!
解法:
vinagreti 指出保存到我的 collection 的数据不是 Objects,而是相当明文。
参照connect-mongo's documentation,多了一个选项stringify
。此设置将 session 中保存的数据字符串化并序列化到数据库中。考虑到 express-session
已经产生 JSON object,使用 stringify()
使得它在 collection.
只需将 stringify: false
添加到我的 mongo 商店设置中,如下所示:
store: new mongoStore({
mongoseConnection: mongoose.connection,
host: '127.0.0.1',
port: '27017',
db: 'testdb',
collection: 'collectionName',
stringify: false
})
然后瞧!保存到 collection 的所有内容现在都是 object 并且可以搜索!谢谢vinagreti 帮忙指出问题!请为他的回答点赞!
您将会话对象保存为纯文本。因此,您不能作为对象进行搜索。
确保 "father" 集合的架构将会话字段作为类型“{}”(对象),如:Father = {session: { type: {}}}
如果不行,您可以尝试以下方法:
您可以更改保存会话对象的方式,将其保存为对象而不是纯文本。
或者,您可以使用正则表达式搜索会话,尝试在会话字段中找到 sid,例如:
db.user.findOne({session: /.*f59106e845e11df8c3413b5f1f80ee01e876526bc3c0d05.*/});