Node.js mongoose模式是否默认创建空数组?
我是mongoose和mongoDB的新手,根据教程,我有一个如下所示的用户模式:Node.js mongoose模式是否默认创建空数组?,node.js,mongodb,mongoose,mongoose-schema,Node.js,Mongodb,Mongoose,Mongoose Schema,我是mongoose和mongoDB的新手,根据教程,我有一个如下所示的用户模式: var userSchema = mongoose.Schema({ local: { email: { type: String, index: { unique: true, dropDups: true } }, pa
var userSchema = mongoose.Schema({
local: {
email: {
type: String,
index: {
unique: true,
dropDups: true
}
},
password: String,
displayName: String,
avatar: {
type: String,
default: "./img/user.png"
},
role: {
type: String,
default: "student"
},
ask_history: [
{
question_id: {
type: mongoose.Schema.Types.ObjectId,
ref: 'questionAnswer'
},
favorite: Boolean,
ask_time: Date
}
],
interest: [String]
},
facebook: {
id: String,
token: String,
email: String,
displayName: String,
avatar: String,
familyName: String,
givenName: String,
gender: String,
ageMin: Number,
role: {
type: String,
default: "student"
},
ask_history: [
{
question_id: {
type: mongoose.Schema.Types.ObjectId,
ref: 'questionAnswer'
},
favorite: Boolean,
ask_time: Date
}
],
interest: [String]
},
twitter: {
id: String,
token: String,
email: String,
name: String,
avatar: String,
role: {
type: String,
default: "student"
},
ask_history: [
{
question_id: {
type: mongoose.Schema.Types.ObjectId,
ref: 'questionAnswer'
},
favorite: Boolean,
ask_time: Date
}
],
interest: [String]
}
}, {strict: true});
它通过用户注册的方式创建用户记录,通过第三方发送本地电子邮件或使用oauth注册
如果创建本地用户,上面的架构将生成如下所示的文档:
{
"_id": {
"$oid": "58792ee6e8a08204a0d68f7a"
},
"twitter": { ////////////////////////////////////////
"interest": [], //
"ask_history": [], //
"role": "student" //
}, // <-- nothing should created for a local user
"facebook": { //
"interest": [], //
"ask_history": [], //
"role": "student" //
}, ////////////////////////////////////////
"local": {
"password": "$2a$10$OtdbF7t52TyNAuwZXFT0u.Q/A.E5TeV4T.shHCxSSxDll2nX4bCbW",
"displayName": "aaa",
"email": "aaa@gmail.com",
"interest": [],
"ask_history": [],
"role": "admin",
"avatar": "./img/user.png"
},
"__v": 0
}
passport.use('local-signup', new LocalStrategy({
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true
}, function(req, email, password, done) {
if (!req.body.name || req.body.name.length == 0) {
return done(null, false, req.flash('signupMessage', 'Name can\'t be empty'));
}
User.findOne({
'local.email': email
}, function(err, user) {
if (err) {
return done(null, false, req.flash('signupMessage', 'Error: ' + err));
} else {
if (validator.validate(email)) {
if (user) {
return done(null, false, req.flash('signupMessage', 'Email already registered.'));
} else {
var newUser = new User();
newUser.local.email = email;
newUser.hashPassword(password);
newUser.local.displayName = req.body.name;
newUser.save(function(err) {
if (err) {
throw err;
}
return done(null, newUser);
});
}
} else {
return done(null, false, req.flash('signupMessage', 'Email not vaild'));
}
}
});
}));
在模式中没有这些数组声明的情况下,文档对于任何类型的用户(例如,本地用户)看起来都很好,文档如下所示(没有facebook或twitter字段):
这是我创建本地用户的功能:
{
"_id": {
"$oid": "58792ee6e8a08204a0d68f7a"
},
"twitter": { ////////////////////////////////////////
"interest": [], //
"ask_history": [], //
"role": "student" //
}, // <-- nothing should created for a local user
"facebook": { //
"interest": [], //
"ask_history": [], //
"role": "student" //
}, ////////////////////////////////////////
"local": {
"password": "$2a$10$OtdbF7t52TyNAuwZXFT0u.Q/A.E5TeV4T.shHCxSSxDll2nX4bCbW",
"displayName": "aaa",
"email": "aaa@gmail.com",
"interest": [],
"ask_history": [],
"role": "admin",
"avatar": "./img/user.png"
},
"__v": 0
}
passport.use('local-signup', new LocalStrategy({
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true
}, function(req, email, password, done) {
if (!req.body.name || req.body.name.length == 0) {
return done(null, false, req.flash('signupMessage', 'Name can\'t be empty'));
}
User.findOne({
'local.email': email
}, function(err, user) {
if (err) {
return done(null, false, req.flash('signupMessage', 'Error: ' + err));
} else {
if (validator.validate(email)) {
if (user) {
return done(null, false, req.flash('signupMessage', 'Email already registered.'));
} else {
var newUser = new User();
newUser.local.email = email;
newUser.hashPassword(password);
newUser.local.displayName = req.body.name;
newUser.save(function(err) {
if (err) {
throw err;
}
return done(null, newUser);
});
}
} else {
return done(null, false, req.flash('signupMessage', 'Email not vaild'));
}
}
});
}));
我的问题是如何将架构设置为当创建文档时,不会创建数组。您的问题到底是什么?您提到了多次创建记录,但我看到的是,在同一个文档(关系数据库中的记录)中,Mongoose正在添加空数组和默认值。您好!请用JS代码发布一个完整的示例,并解释在Mongo中哪些代码产生了好的结果,哪些代码更改产生了坏的结果。@AntonioVal嗨,我更改了标题,很抱歉造成误解,我想问题是在架构中添加数组声明会导致文档生成空字段,即使在创建过程中没有任何内容。@VladFr Hi我已经更新了问题架构和工作架构以及用于创建文档的功能代码。
passport.use('local-signup', new LocalStrategy({
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true
}, function(req, email, password, done) {
if (!req.body.name || req.body.name.length == 0) {
return done(null, false, req.flash('signupMessage', 'Name can\'t be empty'));
}
User.findOne({
'local.email': email
}, function(err, user) {
if (err) {
return done(null, false, req.flash('signupMessage', 'Error: ' + err));
} else {
if (validator.validate(email)) {
if (user) {
return done(null, false, req.flash('signupMessage', 'Email already registered.'));
} else {
var newUser = new User();
newUser.local.email = email;
newUser.hashPassword(password);
newUser.local.displayName = req.body.name;
newUser.save(function(err) {
if (err) {
throw err;
}
return done(null, newUser);
});
}
} else {
return done(null, false, req.flash('signupMessage', 'Email not vaild'));
}
}
});
}));