Node.js mongoose模式是否默认创建空数组?

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

我是mongoose和mongoDB的新手,根据教程,我有一个如下所示的用户模式:

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'));
            }
        }
    });
}));