Express:在现有文档中嵌入文档

Express: Embed document in the existing document

我正在 ExpressNodeMongo 中开发一个应用程序作为数据库。我有一个集合 usersuser 可以有多个 registered-IDs。就像 one-to-many 关系。我正在尝试像这样在用户集合中嵌入 document

post(function (req, res, next) {
    var pid=req.body.pid;
    var sid=req.body.sid;
    var rfname=req.body.rfname;
    var des=req.body.des;
    var brand=req.body.brand;
    var model=req.body.model;
    var serial=req.body.serial;
    var location=req.body.location;

    var arr={pid: 'pid', sid: 'sid', rfname: 'rfname' ,des: 'des', brand: 'brand', model: 'model' ,serial: 'serial', location: 'location'};

    mongoose.model('User').findOne({'pemail': req.session.email}, function (err, user){
        if(err){

        } else {
            user.registeredId = arr;

            user.save(function(err){
                if(err){

                } else {
                    res.render('user/register', {'success': 'dfhlaksdhfh'});
                }
            })
        }
    });
}

我的用户架构是这样的:

var mongoose = require('mongoose');  
var userSchema = new mongoose.Schema({  
  email: String,
  password: String,
  fname: String,
  lname: String,
  plang: String,
  slang: String,
  country: String,
  state: String,
  city: String,
  postalcode: String,
  address1: String,
  address2: String,
  pemail: String,
  semail: String,
  age: String,
  gender: String,
  pphone: String,
  sphone: String,
  q1: String,
  a1: String,
  q2: String,
  a2: String,
  cfname: String,
  clname: String,
  cemail: String
});
mongoose.model('User', userSchema);

指导我,我做错了什么,因为它没有在现有文档中嵌入文档。我是否需要在架构中定义它,如果需要,那么如何定义?

在您的架构定义中,字段 registeredId 未定义,默认情况下通过 strict option,Mongoose 确保将值传递给您的模型构造函数在我们的架构中未指定的内容不会保存到数据库中,因此它不会创建修改后的文档。

您可以在您的模式中显式定义该字段,或者在您的模式定义中将严格选项设置为 false:

// set to false..
var userSchema = new Schema({..}, { strict: false });

然后实施 findAndModify() methods like findOneAndUpdate() 之一,通过将新对象推送到新数组字段 registeredId 来更新您的用户文档。因此,您可以将 post 函数重写为:

post(function (req, res, next) {
    var User = mongoose.model('User'),
        pid=req.body.pid,
        sid=req.body.sid,
        rfname=req.body.rfname,
        des=req.body.des,
        brand=req.body.brand,
        model=req.body.model,
        serial=req.body.serial,
        location=req.body.location, 
        arr = {
            'pid': pid, 
            'sid': sid, 
            'rfname': rfname,
            'des': des, 
            'brand': brand, 
            'model': model,
            'serial': serial, 
            'location': location
        },
        condition = { 'pemail': req.session.email },
        update = {
            "$push": { 'registeredId': arr }
        };

    User.findOneAndUpdate(
        condition,
        update,
        function (err, doc){
            if(err){} 
            else {
                // doc contains the modified document
                res.render('user/register', {'success': 'dfhlaksdhfh'});
            }
        }
    );
});