2015-10-15 3 views
1

Я разрабатываю приложение в Express, Node и Mongo является базой данных. У меня есть коллекция users, а user может иметь mutiple 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); 

Веди меня, то, что я делаю неправильно, потому что он не вставлять документ в существующем документе. Нужно ли мне определять это в схеме, если да, то как?

+0

В вашей схеме не указано поле 'зарегистрированоId', поэтому назначение отклонено. Вы также действительно хотите «массив», если хотите «один-ко-многим» и, конечно, '.push()' этому определенному массиву в схеме. –

ответ

1

В вашем определении схемы, поле registeredId не определен и по умолчанию через strict option, Mongoose гарантирует, что значения, передаваемые в вашей модели конструктора, которые не были указаны в нашей схеме не спасутся в БД, поэтому его не создает измененный документ.

Вы можете явно определить поле в схеме или установить строгую опцию ложна в вашем определении схемы:

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

, а затем реализовать один из методов в findAndModify() как findOneAndUpdate() обновить ваш пользовательский документ, нажав новый объект на новое поле массива registeredId. Таким образом, вы можете повторно написать свою функцию сообщения как:

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'}); 
      } 
     } 
    ); 
}); 
Смежные вопросы