Получить значение от родителя в поддокументе MongoDB

у меня две схемы

childrenSchema = new Schema({
  name: String
});

parentSchema = new Schema({
  type: String,
  children: [childrenSchema]
});

Теперь мне нужен метод в childrenSchema, из которого я получаю тип родителя. Я думаю, это что-то вроде

childrenSchema.methods.generateName = () => {
  // get parent type
};

Существует ли такая функция, как this.parent().type, т.е.

childrenSchema.methods.generateName = () => {
  // get parent type
  return this.parent().type;
};

person Jamgreen    schedule 04.09.2016    source источник
comment
this.ownerDocument() возвращает родительский документ   -  person Ebrahim Pasbani    schedule 04.09.2016
comment
Спасибо, но там написано this.ownerDocument is not a function. Я никогда не делал модели для своего childrenSchema. Означает ли это, что я не могу создать для него метод? Он также не находит this.name, хотя childrenSchema имеет поле name.   -  person Jamgreen    schedule 04.09.2016
comment
Его следует разместить сразу после определения childrenSchema перед использованием в родительской схеме.   -  person Ebrahim Pasbani    schedule 04.09.2016
comment
Я делаю. Но он по-прежнему не распознает this.fieldName и this.functionName().   -  person Jamgreen    schedule 04.09.2016


Ответы (1)


Вы можете сделать так:

 childrenSchema = new Schema({
      name: String
    });

    childrenSchema.methods.generateName = () => {
      // get parent type
      return this.ownerDocument().type;
    };

    parentSchema = new Schema({
      type: String,
      children: [childrenSchema]
    });

    var childModel = mongoose.model('Children', childrenSchema);
    var parentModel = mongoose.model('Parent', parentSchema);

    var parent = new parentModel({type: 'Scifi'});
    parent.children.push(new childModel({name: 'Star wars'}));

    parent.save(function(err, doc){
      console.log(doc.children[0].generateName()); // Scifi
    });
person Ebrahim Pasbani    schedule 04.09.2016
comment
Спасибо! Поэтому рекомендуется создавать модель для каждой схемы (т.е. для всех подсхем), даже если мне нужна только родительская модель? - person Jamgreen; 04.09.2016
comment
Большой. Спасибо. Я, наверное, что-то неправильно понял. Я думал, что могу просто использовать родительскую модель в качестве единственной модели и помещать простые объекты javascript в ее массив вложенных документов. Но «поддокументы» в массиве, вероятно, не считались документами MongoDB, если я не создавал их с помощью const subdoc = new SubDocument({}) (в отличие от const subdoc = {}, как я это делал) - person Jamgreen; 04.09.2016
comment
@Jamgreen Вам решать, какому шаблону следовать. Вы можете определить дочерние элементы как array и обращаться с ними как с обычным свойством в родительском. Так что теперь это не поддокумент, а просто свойство. Но если вы хотите определить метод для вложенного документа или имеет структуру, вам нужно определить их как отдельную схему-модель. - person Ebrahim Pasbani; 04.09.2016
comment
Есть ли разница, использую ли я ваш подход (с parent.save()) вместо parentModel.findByIdAndUpdate(parentId, { $push: { children: new childModel({ ... }) } }, (err, model) => { ... });? Кажется, он не сохраняется правильно с моим подходом. Должен ли я сохранять дочерний экземпляр перед тем, как parentModel.findByIdAndUpdate(parentId, { $push: { children: new childModel({ ... }).save() } }, (err, model) => { ... }); - person Jamgreen; 04.09.2016
comment
@Jamgreen Нет, нет никакой разницы. Для обеспечения того, существовал ли ваш родительский документ ранее в БД? И для сохранения ребенка перед родителем этого делать не нужно. Потому что вы встраиваете дочерний элемент в родительский, а не ссылаетесь на него - person Ebrahim Pasbani; 04.09.2016
comment
Хорошо. Но это также означает, что я не могу обновить дочерний экземпляр с помощью childModel.findByIdAndUpdate(childId, { ... }, (err, child) => { ... }), даже если я знаю конкретный идентификатор дочернего элемента, потому что дочерний элемент встроен только в parentModel и, следовательно, не существует сам по себе? - person Jamgreen; 04.09.2016
comment
@Jamgreen Да. Дочерний документ не существует сам по себе. Потому что он встроен. - person Ebrahim Pasbani; 04.09.2016