Элемент совокупной суммы mongodb как вложенные данные - PullRequest
2 голосов
/ 20 сентября 2019

Вот мои примеры данных в продаже коллекции

[ 
 {group:2, item:a, qty:3 },
 {group:2, item:b, qty:3 },
 {group:2, item:b, qty:2 },
 {group:1, item:a, qty:3 },
 {group:1, item:a, qty:5 },
 {group:1, item:b, qty:5 }
]

, и я хочу запросить данные, как показано ниже, и отсортировать популярную группу по началу

[
 { group:1, items:[{name:'a',total_qty:8},{name:'b',total_qty:5} ],total_qty:13 },
 { group:2, items:[{name:'a',total_qty:3},{name:'b',total_qty:5} ],total_qty:8 },
]

На самом деле мы можем выполнить циклв сценарии сервера (php, nodejs ...), но проблема заключается в разбиении на страницы.Я не могу использовать skip , чтобы получить правильный результат.

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Следующий запрос может дать нам ожидаемый результат:

db.collection.aggregate([
    {
        $group:{
            "_id":{
                "group":"$group",
                "item":"$item"
            },
            "group":{
                $first:"$group"
            },
            "item":{
                $first:"$item"
            },
            "total_qty":{
                $sum:"$qty"
            }
        }
    },
    {
        $group:{
            "_id":"$group",
            "group":{
                $first:"$group"
            },
            "items":{
                $push:{
                    "name":"$item",
                    "total_qty":"$total_qty"
                }
            },
            "total_qty":{
                $sum:"$total_qty"
            }
        }
    },
    {
        $project:{
            "_id":0
        }
    }
]).pretty()

Набор данных:

{
    "_id" : ObjectId("5d84a37febcbd560107c54a7"),
    "group" : 2,
    "item" : "a",
    "qty" : 3
}
{
    "_id" : ObjectId("5d84a37febcbd560107c54a8"),
    "group" : 2,
    "item" : "b",
    "qty" : 3
}
{
    "_id" : ObjectId("5d84a37febcbd560107c54a9"),
    "group" : 2,
    "item" : "b",
    "qty" : 2
}
{
    "_id" : ObjectId("5d84a37febcbd560107c54aa"),
    "group" : 1,
    "item" : "a",
    "qty" : 3
}
{
    "_id" : ObjectId("5d84a37febcbd560107c54ab"),
    "group" : 1,
    "item" : "a",
    "qty" : 5
}
{
    "_id" : ObjectId("5d84a37febcbd560107c54ac"),
    "group" : 1,
    "item" : "b",
    "qty" : 5
}

Выход:

{
    "group" : 2,
    "items" : [
        {
            "name" : "b",
            "total_qty" : 5
        },
        {
            "name" : "a",
            "total_qty" : 3
        }
    ],
    "total_qty" : 8
}
{
    "group" : 1,
    "items" : [
        {
            "name" : "b",
            "total_qty" : 5
        },
        {
            "name" : "a",
            "total_qty" : 8
        }
    ],
    "total_qty" : 13
}
1 голос
/ 20 сентября 2019

Вам необходимо использовать $group агрегацию с $sum и $push аккумулятор

db.collection.aggregate([
  { "$group": {
    "_id": "$group",
    "items": { "$push": "$$ROOT" },
    "total_qty": { "$sum": "$qty" }
  }},
  { "$sort": { "total_qty": -1 }}
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...