Как получить сумму из двух независимых массивов поддокументов в мангусте - PullRequest
0 голосов
/ 31 октября 2019

У меня есть эта схема

    var salesExpenseSchema = new Schema({

        date : {
            month: Number
        },  

        sales: [{amount : Schema.Types.Decimal128}],

        expenses: [{amount : Schema.Types.Decimal128}]

});

Пример записи базы данных подобен этому

{
    _id:'5dbac5dfa1488240cbc4f838',
    date:{month:11},
    sales:[{amount:3000},{amount:5000}],
    expenses: [{amount:5000},{amount:500}]
},
{
    _id:'5dbac5dfa1488240cbc4f838',
    date:{month:10},
    sales:[{amount:2000},{amount:5000}],
    expenses: [{amount:500},{amount:800}]
},
{
    _id:'5dbac5dfa1488240cbc4f838',
    date:{month:09},
    sales:[{amount:2000},{amount:4000}],
    expenses: [{amount:200},{amount:300}]
}

Теперь я хочу получить Суммирование продаж и расходов.

Я использовал Aggregate с $ unwind для продаж и расходов, как показано ниже:

SalesExpense.aggregate([
              {$unwind: "$sales"},
              {$unwind: "$expenses"},
              {$group:{
                    _id:'$_id',
                    sales:{$sum: "$sales.sellPrices"},
                    expenses:{$sum: "$expenses.amount"},
                  }
              },

Но проблема в том ... Если в одном документе массива есть данные, а в другом нет данных, тоон дает 0, т. е. реальное суммирование не получено. То есть, если есть продажи, но нет расходов, то их сумма становится 0, и наоборот.

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

РЕДАКТИРОВАТЬ:

Я отредактировал вопрос и добавил объект даты в мою схему и в записи базы данных: я хочу сделать этосуммирование, основанное на каждом месяце, то есть ... каждый месяц, чтобы иметь свои собственные продажи и расходы ... В некотором роде график с каждым месяцем, имеющим свои собственные продажи и расходы.

Я пытался использовать $группа перед $ project

{$group:{
_id:'$date.month'}}

Но, похоже, не дает ожидаемых результатов.

Я хочу вывод, подобный этому:

[
        {
            "month": "11",
            "sales": {
                "$numberDecimal": "8000"
            },
            "expenses": {
                "$numberDecimal": "5500"
            }
        },

        {
            "month": "10",
            "sales": {
                "$numberDecimal": "7000"
            },
            "expenses": {
                "$numberDecimal": "1100"
            }
        },
        {
            "month": "09",
            "sales": {
                "$numberDecimal": "6000"
            },
            "expenses": {
                "$numberDecimal": "500"
            }
        },
    ]

Как я могу достичьэто?

1 Ответ

0 голосов
/ 31 октября 2019

Вы можете группировать по месяцам и получать итоговые данные следующим образом:

db.collection.aggregate([
  {
    $group: {
      _id: "$date.month",
      "sales": {
        "$sum": {
          "$sum": "$sales.amount"
        }
      },
      "expenses": {
        "$sum": {
          "$sum": "$expenses.amount"
        }
      }
    }
  }
])

Пример данных:

[
  {
    _id: "5dbac5dfa1488240cbc4f838",
    date: {
      month: 11
    },
    sales: [
      {
        amount: 1
      },
      {
        amount: 2
      }
    ],
    expenses: []
  },
  {
    _id: "5dbac5dfa1488240cbc4f839",
    date: {
      month: 11
    },
    sales: [
      {
        amount: 5
      },
      {
        amount: 6
      }
    ],
    expenses: [
      {
        amount: 7
      },
      {
        amount: 8
      }
    ]
  },
  {
    _id: "5dbac5dfa1488240cbc4f840",
    date: {
      month: 12
    },
    sales: [],
    expenses: [
      {
        amount: 7
      },
      {
        amount: 8
      }
    ]
  }
]

Результат:

[
  {
    "_id": 12,
    "expenses": 15,
    "sales": 0
  },
  {
    "_id": 11,
    "expenses": 15,
    "sales": 14
  }
]

Детская площадка:

https://mongoplayground.net/p/K9ofoZx5ORI

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