如何在猫鼬中填充模型

Posted

技术标签:

【中文标题】如何在猫鼬中填充模型【英文标题】:How to populate model in mongoose 【发布时间】:2021-06-29 00:49:16 【问题描述】:

当我向我的订单发送 GET 请求时,响应在我的 orderItems 中返回我的 OjectID。在我的情况下,如何填充模型以获取 orderItems 名称?与产品型号相关的我的订单项目。需要返回产品名称。我是 mongo db 的新人。不太了解 Mongo 中的填充方法

邮递员结果

[
    
        "orderItems": [
            "60668d8514508746c5480ede"
        ],
        "status": "3",
        "_id": "60668d8514508746c5480edf",
        "shippingAddress1": "Lo",
        "shippingAddress2": "2/1",
        "city": "5",
        "zip": "5",
        "phone": "5633",
        "totalPrice": 700,
        "user": 
            "_id": "60644f8d87463d10b8c7bb27",
            "name": "Lopez",
            "id": "60644f8d87463d10b8c7bb27"
        ,
        "dateOrdered": "2021-04-02T03:20:37.884Z",
        "__v": 0,
        "id": "60668d8514508746c5480edf"
    
]

我的获取请求

router.get(`/`, async (req, res) =>
    const orderList = await Order.find().populate('user', 'name').sort('dateOrdered': -1);

    if(!orderList) 
        res.status(500).json(success: false)
     
    res.send(orderList);
)

型号

// Order Model
const orderSchema = mongoose.Schema(
    orderItems: [
        type: mongoose.Schema.Types.ObjectId,
        ref: 'OrderItem',
        required:true
    ],
orderSchema.virtual('id').get(function () 
    return this._id.toHexString();
);

orderSchema.set('toJSON', 
    virtuals: true,
);

exports.Order = mongoose.model('Order', orderSchema);

//Order Items Model

onst orderItemSchema = mongoose.Schema(
    quantity: 
        type: Number,
        required: true
    ,
    product: 
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Product'
    
)

exports.OrderItem = mongoose.model('OrderItem', orderItemSchema);

【问题讨论】:

我尝试了你的代码,没有任何改变,返回了对象 ID。产品未填充 试试Order.find().populate('user', 'name').populate('orderItems') 你得到 orderItems 填充了吗? 【参考方案1】:

订单 -> orderItems -> 产品

选项-1

Order.find().populate('user', 'name').populate( path : 'orderItems', populate :  path : 'product'  )

https://github.com/Automattic/mongoose/issues/1377


选项-2

https://mongoosejs.com/docs/populate.html

https://mongoosejs.com/docs/populate.html#populate-middleware

添加这个:-

const populateProduct = function(next) 
  this.populate('product');
  next();
;

orderItemSchema.pre('findOne', populateProduct).pre('find', populateProduct);

更改查询如下:-

Order.find().populate('user', 'name').populate('orderItems')

https://www.npmjs.com/package/mongoose-autopopulate

【讨论】:

Gupta,谢谢,但在订单列表视图中不起作用。 mongoose-autopopulate,认为在我的情况下它可能是一个很好的解决方案。谢谢

以上是关于如何在猫鼬中填充模型的主要内容,如果未能解决你的问题,请参考以下文章

如何在猫鼬中填充嵌套实体?

在猫鼬中填充嵌套模型

在猫鼬中填充嵌套模型

如何在猫鼬中异步填充嵌套对象?

如何通过填充字段在猫鼬中查找文档?

如何通过填充字段在猫鼬中查找文档?