Mongoose:如何使用模式(产品值)中的数据来使用方法填充另一个模式()中的字段?

时间:2017-09-04 16:44:15

标签: arrays node.js mongoose mongoose-schema mongoose-populate

是否可以使用来自另一个Schema的架构中的值来满足新文档的要求?

我有两个模式;第一个称为产品,第二个称为订单。

产品架构有两个字段:

  1. name(String)
  2. 价格(数量)。
  3. 模型/ products.js:

    var mongoose = require('mongoose')
    var productSchema = mongoose.Schema({
       name: String,
       price: {type: Number}
    })
    
    module.exports = mongoose.model('Product', productSchema)
    

    Orders Schema也有两个字段:

    1. products_ids是产品的ObjectId数组[ObjectId]
    2. total_price应该是所有产品价格的总和。
    3. 模型/ order.js:

      var mongoose = require('mongoose')
      const Product = mongoose.model('Product')
      
      var orderSchema = mongoose.Schema({
        product_id: [{type:  mongoose.Schema.Types.ObjectId, ref: 'Product'}],
        total_price: getTotal(this.product_id)
      })
      
      function getTotal(arrId){
      
        if (arrId.length === 0) {
          return 0;
        }
      
        let totalPrice = 0
      
       arrId.forEach((id) => {
         let prod = new Product()
         prod.findById(id, (product)=>{
          totalPrice += product.price
         })
        })  
        return totalPrice;
      }
      
      module.exports = mongoose.model('Order', orderSchema)
      

      这最后一个字段(total_price)给我带来了麻烦,因为我想创建一个迭代“this.products_ids。”数组中所有值的方法,并自动返回所有价格的总和

      我得到的错误如下: “Schema尚未注册模型”产品“。”

      有解决方法吗?我可以在这里做我想的,还是应该计算出我模型之外的产品价格总和?

1 个答案:

答案 0 :(得分:0)

您可以使用.pre功能。例如在你的代码中:



var mongoose = require('mongoose')
const Product = mongoose.model('Product')

var orderSchema = mongoose.Schema({
    product_id: [{type:  mongoose.Schema.Types.ObjectId, ref: 'Product'}],
    total_price: {type: Number, default:0}
})
orderSchema.pre('save', getTotal (next) {
    let order = this;
  if (arrId.length === 0) {
    return 0;
  }

  let totalPrice = 0

 arrId.forEach((id) => {
   let prod = new Product()
   prod.findById(id, (product)=>{
    totalPrice += product.price
   })
  })  
  order.total_price= totalPrice;

});


module.exports = mongoose.model('Order', orderSchema)