Агрегация MongoDB: сумма поля внутри данных массива и проекции, которая находится в родительской коллекции - PullRequest
0 голосов
/ 28 января 2020

У меня есть две коллекции, одна - это счет, а другая - оплата.

Коллекция счетов выглядит так

{
  _id: "123",
  client: "ABC"
}

Коллекция платежей выглядит как

{
  _id: "456",
  invoiceId: "123",
  amount: 100
},
{
  _id: "789",
  invoiceId: "123",
  amount: 50
}

Я хочу вывод как

{
  _id: "123",
  client: "ABC",
  amount: 150
}

Ответы [ 2 ]

1 голос
/ 28 января 2020

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

db.invoices.aggregate([
  {
    $lookup: {
      from: "payments",
      localField: "_id",
      foreignField: "invoiceId",
      as: "payments"
    }
  },
  {
    $addFields: {
      amount: {
        $sum: "$payments.amount"
      }
    }
  },
  {
    $project: {
      payments: 0
    }
  }
])

Mongoplayground

0 голосов
/ 28 января 2020

Вы можете достичь этого с помощью $lookup, $project и $sum, например:

db.invoice.aggregate([
    {
        //you can remove this stage if you don't need to filter your data
        "$match": {
            "_id": "123"
        }
    },
    {
        "$lookup": {
            "from": "payment",
            "as": "payments",
            "localField": "_id",
            "foreignField": "invoiceId"
        }
    },
    {
        "$project": {
            "client": 1,
            "amount": {
                "$sum": "$payments.amount"
            }
        }
    }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...