2016-07-18 3 views
0
var UserSchema = new Schema({ 
    job : [{ 
    type : mongoose.Schema.Types.ObjectId, 
    experience : String, 
    grade : String, 
    ref: 'Company'}] 
}); 

У пользователя может быть несколько заданий. Когда я добавить задание пользователю, мне нравится это:Ссылка на другую схему в Mongoose С дополнительными полями

Если у меня есть:

req.body.job == {type : company._id, experience : "bla bla", grade : "smth"} 

и

function addJob(req, res, next) { 

    var userId = req.user._id; 
    var job = req.body.job; 
    return User.findById(userId).exec() 
    .then(user => { 
     user.job.push(job); 
     return user.save() 
     .then(handleEntityNotFound(res)) 
     .then(respondWithResult(res)) 
     .catch(handleError(res)); 
    }); 
} 

я получил ошибку:

Unhandled rejection CastError: Cast to ObjectId failed for value "[object Object]" at path "job" 

Но если я сделаю:

req.body.job == {type : company._id, experience : "bla bla", grade : "smth"} 

с

function addJob(req, res, next) { 

     var userId = req.user._id; 
     var job = req.body.job; 
     return User.findById(userId).exec() 
     .then(user => { 
      user.job.push(job.type); // <---------- 
      return user.save() 
      .then(handleEntityNotFound(res)) 
      .then(respondWithResult(res)) 
      .catch(handleError(res)); 
     }); 
    } 

Это работает, но experience и grade не определены. Как я могу указать эти поля?


EDIT:

Так я изменил UserSchema как:

var UserSchema = new Schema({ 
    job : [{ 
    _company : { 
     type : mongoose.Schema.Types.ObjectId, 
     ref: 'Company' 
    }, 
    experience : String, 
    grade : String 
    }] 
}); 

И я попробовал:

//req.body.job == {_company:{type : company._id}, experience : "bla bla", grade : "smth"} 

function addJob(req, res, next) { 

    var userId = req.user._id; 
    var job = req.body.job; 
    return User.findById(userId).exec() 
    .then(user => { 
     user.job.push(job); 
     return user.save() 
     .then(handleEntityNotFound(res)) 
     .then(respondWithResult(res)) 
     .catch(handleError(res)); 
    }); 
} 

Я получил (Внутренняя ошибка сервера) ошибка fr ом сервере

НО

//req.body.job == {_company:{type : company._id}, experience : "bla bla", grade : "smth"} 

function addJob(req, res, next) { 

    var userId = req.user._id; 
    var job = req.body.job; 
    return User.findById(userId).exec() 
    .then(user => { 
     user.job.push(job._company); //<----------------- 
     return user.save() 
     .then(handleEntityNotFound(res)) 
     .then(respondWithResult(res)) 
     .catch(handleError(res)); 
    }); 
} 

работ без ошибок. Однако до сих пор ничего о grade и experience поле в MongoDB ...

ответ

1

«Тип» поле зарезервировано Mongoose, затем

{ 
    type : mongoose.Schema.Types.ObjectId, 
    experience : String, 
    grade : String, 
    ref: 'Company' 
} 

описывает сущность с типом ObjectId, ссылаясь на компанию (этот используется с .populate). К сожалению, поскольку он сохраняется в MongoDB как ObjectId, остальные поля будут игнорироваться.

Вы можете выбрать ссылку на компанию в одном из полей, и быть в состоянии получить дополнительные биты информации с JobSchema как:

{ 
    _company : {type: mongoose.Schema.Types.ObjectId, ref: 'Company'} 
    experience : String, 
    grade : String 
} 

Вы сможете заполнить _company поле ваши работы без потери «опыта» и «класс» информации


После вашего издания:

с данной JobSchema:

{ 
    _company : {type: mongoose.Schema.Types.ObjectId, ref: 'Company'} 
    experience : String, 
    grade : String 
} 

Ваш экземпляр задания должен выглядеть {_company: ObjectId ("......."), опыт работы: "блабла", оценка: "чего-л"}. Тогда ваш req.body.job должен быть {_company: company._id, опыт: «bla bla», оценка: «smth»}

В вашем первом addJob у вас есть ошибка 500, потому что вы просите MongoDB отдать документ, который выглядит как {type: ObjectId ("....")} в ObjectId.

Второй addJob не вызывает ошибку, потому что вы загружаете документ, который выглядит как {type: ObjectId ("...")} (и, кстати, потеряет класс и опыт), и ни один из ваших Необходимо использовать поля схемы, поэтому mongoose игнорирует ваш тип поля и загружает пустой объект в вашу коллекцию.

Т.Л., д-р: Оно должно быть:

// req.body.job == {_company: company._id, experience : "bla bla", grade : "smth"} 

function addJob(req, res, next) { 
    var userId = req.user._id, 
     job = req.body.job; 

    return User.findById(userId) 
       .exec() 
       .then(
        user => { 
         user.job.push(job); 
         return user.save() 
            .then(handleEntityNotFound(res)) 
            .then(respondWithResult(res)) 
            .catch(handleError(res)); 
        } 
       ); 
} 
+0

Да, я думал, что-то вроде этого. Поэтому, я думаю, нет другого решения, верно? – Emidomh

+0

@ Emidomh Я не думаю, что есть другое решение, извините:/ – GnsBeldaran

+0

Я отредактировал мое сообщение, пожалуйста, взгляните :) – Emidomh

Смежные вопросы