Мне нужен групповой конвейер mongodb для нескольких условий - PullRequest
0 голосов
/ 27 мая 2020
Document

    [
        {
            type: 1,//credit
            amount: 60
        },
        {
            type: 2,//debit
            amount: 35
        },
        {
            type: 3,//credit
            amount: 25
        },
        {
            type: 4,//debit
            amount: 80
        },
        {
            type: 5,//credit
            amount: 70
        },
    ]

Result

[
    {
        _id: {
            Name: "Credition",
            Type: [1, 3, 5]
        },
        Total_Amount: 155
    },
    {
        _id: {
            Name: "Debition",
            Type: [2, 4]
        },
        Total_Amount: 115
    },
]

В моей схеме есть миллионы записей журналов, в которых мало зачисленных журналов, несколько журналов списания.

Я хочу использовать агрегатный канал MongoDB и должен сгруппировать, как указано выше, для миллиона записей за один раз

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Вы можете использовать оператор $cond на этапе группировки:

db.collection.aggregate([
  {
    $group: {
      _id: {
        $cond: [
          {
            $in: [ "$type", [1,3,5] ]
          },
          "Credition",
          "Debition"
        ]
      },
      type: {
        $addToSet: "$type"
      },
      amount: {
        $sum: "$amount"
      }
    }
  },
  {
    $project: {
      _id: {
        Name: "$_id",
        Type: "$type"
      },
      Total_Amount: "$amount"
    }
  }
])

MongoPlayground

1 голос
/ 27 мая 2020

Да, вы можете сделать это, сначала вам нужно добавить новое поле транзакции на основе типа журналов, затем вы можете сгруппировать журналы на основе этого поля.

Рабочий пример - https://mongoplayground.net/p/e4kqeKLIuIr

db.collection.aggregate([
  {
    $addFields: {
      transaction: {
        $cond: {
          if: {
            $in: [
              "$type",
              [
                1,
                3,
                5
              ]
            ]
          },
          then: "Credition",
          else: "Debition"
        }
      }
    }
  },
  {
    $group: {
      _id: "$transaction",
      Type: {
        $addToSet: "$type"
      },
      Total_Amount: {
        $sum: "$amount"
      }
    }
  }
])

После этого вы также можете использовать оператор $ project для изменения имени или структуры записи, если необходимо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...