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

Posted

技术标签:

【中文标题】Mongoose:如何使用来自模式的数据(产品值)使用方法填充另一个模式()中的字段?【英文标题】:Mongoose: How to use data from a schema (product value) to populate a field in another schema () using a method? 【发布时间】:2018-02-12 22:37:18 【问题描述】:

是否可以在一个模式中使用来自另一个模式的值来满足新文档的要求?

我有两个模式;第一个称为 Products,第二个称为 Orders。

Products Schema 有两个字段:

    名称(字符串) 价格(数字)。

模型/products.js:

var mongoose = require('mongoose')
var productSchema = mongoose.Schema(
   name: String,
   price: type: Number
)

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

Orders Schema 也有两个字段:

    products_ids 是产品 [ObjectId] 的 ObjectId 数组 total_price 应该是所有产品价格的总和。

models/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”中的所有值。数组并自动返回所有价格的总和

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

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

【问题讨论】:

【参考方案1】:

您可以使用.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)

【讨论】:

以上是关于Mongoose:如何使用来自模式的数据(产品值)使用方法填充另一个模式()中的字段?的主要内容,如果未能解决你的问题,请参考以下文章

mongoose如何查找某个数组里含有某个值

使用mongodb和mongoose(nodejs)的不同字段名称映射多个数据源

设置 Mongoose 模式进行身份验证后,如何使用 Mongodb 查询数据库?

来自猫鼬模式的角度接口

使用 Mongoose 模式导入 CSV

如何将来自 Mongoose 的 JSON 映射到 Vue 和 Quasar?