node.js - 尽管路径已填充,但 Mongoose 填充()返回未定义
问题描述
我有以下猫鼬模式:
// server/models/Order.js
const { connection, model, Schema } = require('mongoose');
const itemSchema = new Schema({
product: { type: Schema.Types.ObjectId, ref: 'Product', required: true },
quantity: { type: Number, required: true },
purchasePrice: {
type: Schema.Types.Decimal128, get: Number, required: true, validate: {
validator: function (value) {
return !this.populated('product') || +value === this.product.price;
},
}
},
});
const schema = new Schema({
// ...
items: [itemSchema],
// ...
});
module.exports = model('Order', schema);
我的服务器创建一个新订单,填充它,然后尝试保存它:
// server/routers/order.js
const Order = require('../models/Order');
const order = new Order({ ... });
await order.populate('items.product').execPopulate();
const { _id } = await order.save();
它调用验证函数。调试器显示this.product
引用有效文档,但this.populated('product')
返回undefined
,因此+value === this.product.price
不评估比较。
这是 Mongoose 中的一个错误,还是出于某种原因它应该如何表现?
解决方案
是的,我认为这是一个错误。我也发现了这个。
const trackSchema=new Schema({
song:{
type:Schema.Types.ObjectId,
ref:"Attachments",
index:true
},
played:{
type:Number,
default:0
}
});
const playlistSchema=const plSchema=new Schema({
name:String,
tracks:[trackSchema]
});
填充前:
playlist.tracks.forEach((track)=>{
console.log('track.song: ',track.song);
//this prints ObjectId
});
填充后:
await playlist.populate('tracks.song').execPopulate();
playlist.tracks.forEach((track)=>{
console.log('track.song: ',track.song);
//this prints undefined
});
修改为:
await playlist.populate('tracks').execPopulate();
playlist.tracks.forEach((track)=>{
console.log('track.song: ',track.song);
//this prints undefined
});
仍然未定义♂️</p>