NodeJS MongoDB如何形成一个查询,以获得最畅销的产品排名为每个产品

zzoitvuj  于 2023-03-12  发布在  Node.js
关注(0)|答案(1)|浏览(139)

js和mongoose以及我发现解决这个问题有些困难,因为我的mongodb数据库中有订单模式,我想从最高到最低排列最畅销的产品,这是文档的外观:

因此,如图所示,有一个shopping_cart,它是一个产品数组,可以通过product _id区分这些产品,并且每个产品都有数量(价格不相关)。

const topselling=Order.aggregate([
    {
      "$unwind": "$items"
    },
    {
      "$group": {
        "_id": "$items.itemId",
        "sum": {
          "$sum": "$items.qty"
        }
      }
    },
    {
      "$sort": {
        sum: -1
      }
    },
    {
      "$group": {
        "_id": null,
        "top_selling_products ": {
          $push: "$_id"
        }
      }
    }
  ])
  console.log(topselling)

但是当我控制台记录时,我得到了这样的输出:

Aggregate {
  _pipeline: [
    { '$unwind': '$items' },
    { '$group': [Object] },
    { '$sort': [Object] },
    { '$group': [Object] }
  ],
  _model: Model { Order },
  options: {}
}

我希望输出如下所示:

[
  {
    "_id": null,
    "top_selling_products ": [
      {"title":"carrots","price":100,"imageUrl":"...imageurl"...},
      {"title":"Beans","price":200,"imageUrl":"...imageurl"...},
    ]
  }
]
vmdwslir

vmdwslir1#

Model.aggregate()文档中,查询没有执行,您必须提供回调函数才能执行它。
这两种方法都可以:
1.提供回调。

const topselling = Order.aggregate(/* Pipeline */)
  .then((res) => {
    console.log(res);
  })
  .catch((err) => {
    console.error(err);
  });

1.使用异步函数(await)。

const topselling = await Order.aggregate(/* Pipeline */);

1.使用.exec()执行查询。

const topselling = Order.aggregate(/* Pipeline */)
  .exec();

当你把ObjectId而不是object推入top_selling_products数组时,$last组阶段有一些东西。最后一个$group应该是:

{
  "$group": {
    "_id": null,
    "top_selling_products": {
      $push: "$$ROOT"
    }
  }
}

$$ROOT表示整个文档。
您的最终输出将是:

[
  {
    "_id": null,
    "top_selling_products": [
      { "_id": ObjectId("..."), "sum": 100 },
      { "_id": ObjectId("..."), "sum": 200 }
    ]
  }
]

相关问题