Запрос Mongodb Сумма первых элементов массива объектов - PullRequest
2 голосов
/ 03 ноября 2019

Я хотел бы написать запрос для суммирования каждого поля payment первого объекта в массиве для каждого элемента моей базы данных.

Схема следующая:

var schema = new Schema({
    plate : String,
    category : String,
    brand : String,
    model : String,
    sign : String,

    tax : [{
        date : { type: Date, default: Date.now },
        payment : { type: Number, default: 0 },
    }],


});

Я написал следующую функцию для моего запроса:

function(callback){     
        Machine.aggregate(
            [
                {$unwind: "$tax"},
                {$group : {
                    _id : null ,
                    tot : { $sum: "$tax.payment"}
                }}
            ]
        ,callback);
    }

Но таким образом я получаю сумму всех платежей внутри налога на массив. Моя цель - взять только первое, поэтому я попытался с $tax.0.payment и с использованием arrayElemAt : [$tax,0], но все мои испытания дали тотал = 0.

Ответы [ 3 ]

2 голосов
/ 03 ноября 2019

Идея здесь состоит в том, чтобы выбрать первый элемент каждого поля массива payment через $arrayElemAt с проекцией, а затем группировать сумму поля $group $sum.

Запрос:

db.collection.aggregate([
  {
    $project: {
      firstPayment: {
        $arrayElemAt: [
          "$tax",
          0
        ]
      }
    }
  },
  {
    $group: {
      _id: null,
      PaymentSum: {
        $sum: "$firstPayment.payment"
      }
    }
  }
]);

Демо O / P:

[
  {
    "PaymentSum": 11,
    "_id": null
  }
]
1 голос
/ 03 ноября 2019
Machine.aggregate({$unwind: 
        {path: "$tax"}
    },
    {$group:{
         _id: "$_id",
         payment: {$first: "$tax.payment"}
    }},
    {$group: {
        _id: null,
        total: {$sum: "$payment"}
    }}
)

Объяснение:

Сначала я использовал $unwind по налогу, затем по первому $group stage я сгруппировалв соответствии с _id ,

, таким образом, я получу первую информацию о платеже из массива непогашенных налогов.

Затем я добавил $ sum, чтобы добавить их во второй $group stage.

Я проверил с этими данными:

Машина Коллекция документов:

{
    "_id" : ObjectId("5dbf09a4d7912bcbc61ee9e4"),
    "tax" : [
        {
            "payment" : 10
        },
        {
            "payment" : 20
        }
    ]
},
{
    "_id" : ObjectId("5dbf09aad7912bcbc61ee9e5"),
    "tax" : [
        {
            "payment" : 30
        },
        {
            "payment" : 40
        }
    ]
},
{
    "_id" : ObjectId("5dbf09afd7912bcbc61ee9e6"),
    "tax" : [
        {
            "payment" : 50
        },
        {
            "payment" : 60
        }
    ]
}

Результат Я получил:

{ "_id" : null, "tot" : 90 }

Надеюсь, это соответствует вашим требованиям.

0 голосов
/ 03 ноября 2019

Добавьте $ arrayElemAt в свою совокупность следующим образом ..

Machine.aggregate(
        [
            {$unwind: "$tax"},
            {$group : {
                _id : null ,
                tot : { $sum:  { $arrayElemAt : [ "$tax.payment", 0  ]}
            }}
        ]
    ,callback);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...