Монго Агрегация получить разницу между значениями объектов массива - PullRequest
0 голосов
/ 11 февраля 2019

Добрый день, у меня возникли проблемы с использованием агрегации в mongodb для получения разницы в датах между двумя значениями в массиве, структура моего документа выглядит следующим образом:

{
    "_id" : ObjectId("5c591420a890362dec70fcf4"), 
    "tracetag" : "T00005", 
    "amounts" : [
        {
            "_id" : ObjectId("5c5915bea890362dec71015a"), 
            "startdate" : ISODate("2019-02-15T04:49:02.000+0000"), 
            "enddate" : ISODate("2019-02-15T04:50:05.000+0000"), 
            "amount" : 18.975946800811833, 
        }, 
        {
            "_id" : ObjectId("5c5915bea890362dec71015b"), 
            "startdate" : ISODate("2019-02-16T04:49:02.000+0000"), 
            "enddate" : ISODate("2019-02-16T04:51:52.000+0000"), 
            "amount" : 3.5755730555836203, 
        }, 
        {
            "_id" : ObjectId("5c5915bea890362dec71015c"), 
            "startdate" : ISODate("2019-02-17T04:49:02.000+0000"), 
            "enddate" : ISODate("2019-02-17T04:50:04.000+0000"), 
            "amount" : 2.3937573313380383, 
        }
    ], 
}

количество записей «сумма»не фиксированный, так что это может быть 1 или 50 и т. д.

для каждого документа, я хотел бы получить разницу между «конечной датой» и «начальной датой» (или продолжительностью), и я хотел бы суммироватьПродолжительность (давайте назовем это общее время).Я могу сделать общую сумму без проблем, но получение длительности дает мне ошибку "" не могу вычесть массив из массива ", моя агрегация выглядит так:

{ 
            "$project" : {
                "tracetag" : 1.0,  
                "totalamount" : {
                    "$sum" : "$amounts.amount"
                }, 
                "totalduration" : {
                "$sum" : {
                     "$subtract" : [
                        "$amounts.enddate", 
                        "$amounts.startdate"
                    ]
                  }
                }
            }
        }, 

1 Ответ

0 голосов
/ 30 мая 2019

ОК, поэтому мне удалось ответить на мой собственный вопрос: «суммы» необходимо разделить с помощью оператора $ unwind, затем к каждой записи (длительности) можно добавить поле, в моем случае я хотел, чтобы продолжительность была в минутах.После этого я снова все сгруппировал

{
      "$unwind" : { "path" : "$amounts" }
    },
    {
      "$addFields" : {
          "duration" : { "$divide" : [ { "$subtract" : [ 
"$enddate", "$startdate" ]}, 60000.0 ] }
      }
    },
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...