是否可以使用来自另一个Schema的架构中的值来满足新文档的要求?
我有两个模式;第一个称为产品,第二个称为订单。
产品架构有两个字段:
模型/ products.js:
var mongoose = require('mongoose')
var productSchema = mongoose.Schema({
name: String,
price: {type: Number}
})
module.exports = mongoose.model('Product', productSchema)
Orders Schema也有两个字段:
模型/ 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尚未注册模型”产品“。”
有解决方法吗?我可以在这里做我想的,还是应该计算出我模型之外的产品价格总和?
答案 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)