mongoose是无法填充默认值为空对象的ref id

我的模式如下所示:

const order = new Schema({ order_status: Number, foodtruck_id: { type: Schema.Types.ObjectId, ref: 'foodtruck' }, customer_id: { type: Schema.Types.ObjectId, ref: 'user' }, items: [{ type: Schema.Types.ObjectId, ref: 'items' }], user_type: Boolean, order_time: Date, order_rating: { type: Number, default: 5.0 }, order_issue_comments: String, order_special_instruction: String, order_total: Number, order_location: String, order_coupon_code: String, payment_id: { type: Schema.Types.ObjectId, ref: 'payment' }, order_meta: { type: Schema.Types.Mixed, ref: 'order_sub_info', default: {} } }, { versionKey: false }, { minimize: false }); 

我的查询如下所示:

 order.find({ 'foodtruck_id': foodtruck_id.trim() }).populate('customer_id', { '_id': 1, 'user_name': 1, 'email_id': 1, 'ph_no': 1, 'login_type': 1 }).populate('items'). populate('order_meta', 'order_otp').exec((err, orderList) => { if (err) res.json({ status: '500', message: err }); else { console.log("called"); res.json({ status: '200', message: 'Order list', data: orderList }); } }); 

对于这个查询,它给了我Cast to ObjectId failed for value at path _id因为order_meta具有默认值{} 。 如何有效填充查询,以便它可以照顾这个testing用例?

将空对象放在需要引用id的地方是不好的主意。 两者 – 对于填充问题和常识(如果它是有参考的领域,应该是空/未定义或引用本身)。

通常情况下,您希望在某个端点上转换数据,但不应该干扰数据库或应用程序的业务逻辑。

您可以定义到应该用于您的模型的JSON方法。 在你的情况

 const order = new Schema({ order_status: Number, foodtruck_id: { type: Schema.Types.ObjectId, ref: 'foodtruck' }, customer_id: { type: Schema.Types.ObjectId, ref: 'user' }, items: [{ type: Schema.Types.ObjectId, ref: 'items' }], user_type: Boolean, order_time: Date, order_rating: { type: Number, default: 5.0 }, order_issue_comments: String, order_special_instruction: String, order_total: Number, order_location: String, order_coupon_code: String, payment_id: { type: Schema.Types.ObjectId, ref: 'payment' }, order_meta: { type: Schema.Types.ObjectId, ref: 'order_sub_info'} }, { versionKey: false }, { minimize: false }); order.options.toJSON = { transform(zipRequestDocument, ret, options) { // eslint-disable-line no-unused-vars if (!ret.order_meta){ ret.order_meta = {}; } }, };