如何在Express JS中执行多个填充?

时间:2018-09-26 04:37:32

标签: node.js express mongoose populate

我正在尝试执行多个填充,到目前为止,只有最后一个填充正在执行。

这是我的代码,

router.get("/", (req, res, next) => {
  Order.find()
    .select("product quantity _id")
    .populate('product', 'name')
    .populate('product', 'price')
    .populate('product','productImage')
    .exec()
    .then(docs => {
      res.status(200).json({
        count: docs.length,
        orders: docs.map(doc => {
          return {
            _id: doc._id,
            product: doc.product,
            productImage: doc.productImage,
            name: doc.name,
            price: doc.price,
            quantity: doc.quantity,
            request: {
              type: "GET",
              url: "http://localhost:3000/orders/" + doc._id
            }
          };
        })
      });
    })
    .catch(err => {
      res.status(500).json({
        error: err
      });
    });
});

我仅获得productImage。如果删除productImage,我会得到一个价格。简而言之,只有最后一个填充有效

我将其作为输出

> {
>     "count": 2,
>     "orders": [
>         {
>             "_id": "5ba8cb0016e76b50288e67ba",
>             "product": {
>                 "_id": "5ba8c93916e76b50288e67b9"
>             },
>             "quantity": 2,
>             "request": {
>                 "type": "GET",
>                 "url": "http://localhost:3000/orders/5ba8cb0016e76b50288e67ba"
>             }
>         },
>         {
>             "_id": "5baa1c5c121b9350d309ce6a",
>             "product": {
>                 "_id": "5baa1a96d6fc025019a15287",
>                 "productImage": "uploads/2018-09-25T11:23:02.744ZScreenshot from 2018-08-07
> 11-27-31.png"
>             },
>             "quantity": 1,
>             "request": {
>                 "type": "GET",
>                 "url": "http://localhost:3000/orders/5baa1c5c121b9350d309ce6a"
>             }
>         }
>     ]

2 个答案:

答案 0 :(得分:1)

根据Mongoose文档,如果您使用相同的路径多次调用populate(),则只有最后一个才会生效。

如果您使用的是猫鼬v3,我相信以下代码将为您工作。

Order.find()
.select("product quantity _id")
.populate('product', 'name price productImage')
.exec()
.then(docs => {
     .....
     .....
})

猫鼬文档参考。  https://mongoosejs.com/docs/populate.html

答案 1 :(得分:0)

我想

  Order.find()
    .select("product quantity _id")
    .populate('product', 'name')
    .populate('product', 'price')
    .populate('product','productImage')
    .exec()

不起作用,因为您一次又一次地为同一refrence填充单个特定字段。

发生了什么事?

  1. 产品填充了名称字段。
  2. 您再次在价格字段中填充产品并覆盖之前的文档。
  3. 您再次填充productImage字段并覆盖以前的文档。

您需要做什么?

  Order.find()
    .select("product quantity _id")
    .populate('product', 'name price producImage')

field name syntax呼叫单个填充,并查看field selection