Проблема с добавлением элемента в массив ссылочных объектов Мангуста - PullRequest
0 голосов
/ 22 апреля 2019

В моем приложении NodeJS и MongoDB у меня есть 2 схемы mongoose:

companySchema:

const companySchema = new Schema({
  name: {
    type: String,
    required: true
  },
  products: [{
      type: Schema.Types.ObjectId,
      ref: 'Product',
      required: false
  }]
});

companySchema.statics.addProduct = function (productId) {
  let updatedProducts = [...this.products];
  updatedProducts.push(productId);
  this.products = updatedProducts;
  return this.save();
}

module.exports = mongoose.model(‘Company’, companySchema);

productSchema:

const productSchema = new Schema({
  name: {
    type: String,
    required: true
  },
  quantity: {
    type: Number,
    required: true
  }
});

module.exports = mongoose.model('Product', productSchema);

Каждый раз, когда я добавляю новый продукт в productSchema, я хотел бы добавить _id недавно созданного продукта в массив products в companySchema, чтобы впоследствии легко получить доступ к продуктам. Для этого я написал:

const Company = require('../models/company');
const Product = require('../models/product ');

exports.postAddProduct = (req, res, next) => {
  const name = req.body.name;
  const quantity = req.body.quantity;

  const product = new Product({
    name: name,
    quantity: quantity
  });
  product.save()
    .then(product => {
      return Company.addProduct(product._id);
    })
    .then(result => {
      res.redirect('/');
    })
    .catch(err => console.log(err));
}

Я получаю сообщение об ошибке: TypeError: this.products is not iterable.

1 Ответ

0 голосов
/ 22 апреля 2019

Вы устанавливаете статический метод , который является методом модели, а не экземпляра документа.

Следовательно, this относится к самой модели, а не к отдельному документу..

В отличие от документа, модель не имеет массива (итеративного) с именем products , поэтому ее нельзя распространить на новый массив.

Попробуйте использовать методы вместо статика :

companySchema.methods.addProduct = function (productId) {
  ...
}

Надеюсь, это поможет.

...