как получить желаемый результат от агрегирования mon go - PullRequest
0 голосов
/ 20 апреля 2020

Содержит данные в пн go коллекции элементов, например:

> db.items.find()
{ "_id" : ObjectId("5e9d57f8b018eecfd91c785a"), "customer_id" : 1, "goods_id" : 10, "op_code" : 1, "op_value" : 5 }
{ "_id" : ObjectId("5e9d57f8b018eecfd91c785b"), "customer_id" : 1, "goods_id" : 10, "op_code" : 1, "op_value" : 2 }
{ "_id" : ObjectId("5e9d57f8b018eecfd91c785c"), "customer_id" : 1, "goods_id" : 10, "op_code" : 2, "op_value" : 5 }

Поле "op_code" обозначает операцию плюс или минус (значение 1 для операции плюс и 2 для минуса), а также "op_value" "поле является абсолютным значением. Как подсчитать общее значение группы "op_value" по полям "customer_id" и "goods_id".

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

# "total" field stands for sum of "op_value", "op_code" value 1 is plus while 2 is minus.
{ "_id" : { "customer_id" : 1, "goods_id" : 10}, "total" : 2 } # 5 + 2 - 5

mon go версия: 3.2.12

Спасибо.

1 Ответ

0 голосов
/ 20 апреля 2020

Это работает, как вы ожидали,

  db.items.aggregate(
    {
        $group: {
            _id: {
                "customer_id": "$customer_id",
                "goods_id": "$goods_id"
            },
            "pos": { 
               "$sum": { 
                   "$cond": [
                       { "$eq": [ "$op_code", 1 ] },
                       "$op_value",
                       0
                   ]
               }
            },
            "neg": { 
               "$sum": { 
                   "$cond": [
                       { "$eq": [ "$op_code", 2 ] },
                       "$op_value",
                       0
                   ]
               }
            }
        }
    },
    { "$project": {
       "_id": "$_id",
       "total": { "$subtract": [ "$pos", "$neg" ] }
    }})
...