尽管路径被填充,猫鼬填充()返回未定义

Posted

技术标签:

【中文标题】尽管路径被填充,猫鼬填充()返回未定义【英文标题】:Mongoose populated() returns undefined despite the path being populated 【发布时间】:2021-04-15 17:05:51 【问题描述】:

我有以下 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 中的一个错误,还是出于某种原因它的行为方式?

【问题讨论】:

【参考方案1】:

是的,我认为这是一个错误。 我也发现了这个。

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
);

仍未定义?‍♂️

【讨论】:

以上是关于尽管路径被填充,猫鼬填充()返回未定义的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬填充未填充必填字段

listView 颤动中未定义子项和填充

未捕获的类型错误:尝试使用 PHP 填充响应式数据表时无法读取未定义的属性“长度”?

猫鼬嵌套文档返回未定义

pytorch torch.empty()函数(返回填充有未初始化数据的张量。 张量的形状由可变的参数大小定义)

ExtJS json 存储未填充