将项目添加到猫鼬引用对象数组时出现问题

Posted

技术标签:

【中文标题】将项目添加到猫鼬引用对象数组时出现问题【英文标题】:Problem with adding an item to an array of mongoose reference objects 【发布时间】:2019-09-11 19:45:33 【问题描述】:

在我的 NodeJS 和 MongoDB 应用程序中,我有 2 个猫鼬模式:

公司架构:

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添加到companySchema中的products数组中,以便以后轻松访问产品。 为此,我写道:

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】:

您正在设置一个静态方法,它是模型而不是文档实例上的方法。

因此,this 指的是模型本身,而不是单个文档。

与文档不同,模型没有一个名为 products 的数组(可迭代),因此无法将其展开到新数组中。

尝试使用 methods 而不是 statics

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

我希望这会有所帮助。

【讨论】:

以上是关于将项目添加到猫鼬引用对象数组时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

如何将json对象数组保存到猫鼬?

如何仅通过一次调用将一组对象保存到猫鼬数据库?

将订单集合中的订单总和添加到猫鼬中的用户集合

将普通对象投射到猫鼬文档

使用猫鼬将对象数组添加到子文档

无法在用户对象(猫鼬)中保存消息 ID