2015-03-12 4 views
0

Я пытаюсь реализовать каскадную вставку для объектов с отношением 1 к многим в Mongoose/MongoDB и изо всех сил пытаюсь ее реализовать. В этом случае университет имеет отношения «один-много» с отделами. Вот мой университетский объект.Как реализовать каскадную вставку с MEAN/MongoDB?

var UniversitySchema = new Schema({ 
 
    name: { 
 
    type: String, 
 
    default: '', 
 
    trim: true 
 
    }, 
 
    departments: [{ 
 
    type: Schema.ObjectId, 
 
    ref: 'Department' 
 
    }] 
 
}); 
 

 
mongoose.model('University', UniversitySchema);

Вот мой отдел схемы:

var DepartmentSchema = new Schema({ 
 
    name: { 
 
    type: String, 
 
    default: '', 
 
    trim: true 
 
    }, 
 
    University: { 
 
    type: Schema.ObjectId, 
 
    ref: 'University' 
 
    }] 
 
}); 
 

 
mongoose.model('Department', DepartmentSchema);

Вот что я пытался положить внутри пост в схеме. В основном, когда я сохраняю отдел, я пытаюсь вставить идентификатор отдела в университет, чтобы установить отношения одного и того же в обоих направлениях. Конечно, я также сохраняю идентификатор университета при создании отдела, что довольно просто.

DepartmentSchema.post('save', function(next) { 
 
    var university = University.find({_id: this.university._id}); 
 
    if(!university.departments) { 
 
    \t university.departments = []; \t 
 
    } 
 
    \t university.departments.push(new ObjectId(this._id)); 
 
    university.save().exec(); 
 
    next(); 
 
});

Это дает ошибку на этой линии, заявив, что не может распознать сохранить метод на объекте университета.

university.save().exec();

Я также попытался сделать это внутри контроллера модели сервера, но это не кажется правильным, поскольку большинство методов завернуты по запросу REST. Конечно, я могу справиться с этим с клиентской стороны, выполнив несколько запросов, но я полагаю, что есть способ сделать это на стороне сервера. Поскольку это очень внутренне относится к слою данных, на мой взгляд, я должен иметь возможность справиться с этим, используя промежуточное ПО mongo.

ответ

2

Результат запросов получить передаются функции обратного вызова, не возвращается.

var university = University.findOne({_id: this.university._id}); 

Переменная university теперь является объектом запроса, а не результат запроса. Вот почему вы получаете TypeError: Object# <Query> has no method 'save'. Результаты запросов передаются функции обратного вызова запроса:

University.findOne({_id: this.university._id}, function(err, university){ 

    // here is your result 
}); 

Аналогично, вам необходимо пройти заключительный обратный вызов в вашей экономии:

university.save(next) 
+0

Теперь я положил внутри обратного вызова, а также с помощью обратного вызова для сохранения, но я все еще получаю ошибку на university.save 'DepartmentSchema.post ('сохранить', функция (следующий) { University.find ({ _id: this.university._id }, функция (эээ, университет) { если (! Университет.депозиты) { университет.департамент = []; } университет.departments.push (новый ObjectId (this._id)); университет.save (функция (ошибка) { if (err) return console.log ('err ->' + err) // сохранен! }); }); }); '' university.save (функция (ERR) { \t^ TypeError: Объект не имеет метода 'Сохранить' ' –

1

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

university.save(function (err) { 
    if (err) return handleError(err); 
    // saved! 
}) 
Смежные вопросы