按ID分组并按猫鼬Express Node JS中的总数进行排序

时间:2020-09-07 10:39:02

标签: javascript node.js express mongoose

我有一个这样的收藏集:

{
"_id": {
    "$oid": "5f54b3333367b91bd09f4485"
},
"products": [
    {
        "_id": 20,
        "name": "Türk Kahvesi",
        "price": 8,
        "count": 2
    },
    {
        "_id": 22,
        "name": "Dibek",
        "price": 10,
        "count": 2
    },
    {
        "_id": 21,
        "name": "Damla Sakızlı T.K.",
        "price": 10,
        "count": 1
    }
],
"deskId": "5f53473611f7490d3c860ccd",
"waiterId": "1",
"deskName": "Ü2",
 },


{
"_id": {
    "$oid": "5f54af663367b91bd09f4483"
},
"products": [
    {
        "_id": 20,
        "name": "Türk Kahvesi",
        "price": 8,
        "count": 1
    },
    {
        "_id": 21,
        "name": "Damla Sakızlı T.K.",
        "price": 10,
        "count": 1
    },
    {
        "_id": 22,
        "name": "Dibek",
        "price": 10,
        "count": 1
    },
    {
        "_id": 23,
        "name": "Menengiç",
        "price": 10,
        "count": 1
    },
    {
        "_id": 25,
        "name": "Double Espresso",
        "price": 15,
        "count": 6
    }
],
"deskId": "5f53473611f7490d3c860ccd",
"waiterId": "1",
"deskName": "Ü2",
 }

我的目标是,按product._id获取所有数据顺序和组,并显示totalPrice(price * count),products.name,_id和totalCount。这实际上是向我们展示了按产品列出的报告。如果您需要更多信息,请询问。样本结果:

{
{
    "_id": 20,
    "name": "Türk Kahvesi",
    "totalCount": 3,
    "totalPrice": 24
},
{
    "_id": 22,
    "name": "Dibek",
    "totalCount": 3,
    "totalPrice": 30
},
{
    "_id": 21,
    "name": "Damla Sakızlı T.K.",
    "totalCount": 2,
    "totalPrice": 20
},
{
    "_id": 23,
    "name": "Menengiç",
    "totalCount": 1,
    "totalPrice": 10
},
{
    "_id": 25,
    "name": "Double Espresso",
    "totalCount": 6,
    "totalPrice": 90
}
}

我们可以在某些东西上使用聚合。请帮助我。

1 个答案:

答案 0 :(得分:2)

我还是MongoDB的新手,但我认为您正在寻找这个聚合管道。也就是说,您应该使用文档进行研究,但是,只要您了解思想过程,您就会学到一些东西,所以一切都很好!

[

        {
          $unwind: {
            path: '$products',
            // Here we are seperating each item in the products array of
            // the user(I presumed your objects were users, or carts maybe)
            // It will now be available to the next stage of the pipeline as
            // a singular object for each item in the array,
            // see the picture below for how this works practically.
          }
        },
        {
          $group: {
            // Now we're going to restructure the object to
            // center around the id field of the products, and
            // at the same time we can add up the total price
            // and count of each item.
            _id: '$products.id', // This is the selector for the grouping process (in our case it's the id)
            item: { $first: '$$ROOT.products' }, // this is me thinking you'll want access to the item in question for each total.
            totalCount: { $sum: "$products.count" }, // adds to totalCount EACH $products.count that we have
            totalPrice: { $sum: { $multiply: ["$products.price", '$products.count'] } }, // self explanatory
          }
        }
]

这是展开对数组和对象的作用 VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV Foor fighters

注意事项:出于实际原因,我修改/删除了一些变量名(_id,oid),您必须解析哪些变量名,并且如果复制粘贴,此代码很可能无法立即使用