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

У меня есть данные временного ряда в следующем формате

{
    "_id" : "adfsdgsd",
    "data" : [ 
        {
            "d" : ISODate("2006-11-14T00:00:00.000Z"),
            "v" : 10.0
        }, 
        {
            "d" : ISODate("2006-11-16T00:00:00.000Z"),
            "v" : 10.279
        }, 
        {
            "d" : ISODate("2006-11-17T00:00:00.000Z"),
            "v" : 10.208
        }, 
        {
            "d" : ISODate("2006-11-20T00:00:00.000Z"),
            "v" : 10.243
        }, 
        {
            "d" : ISODate("2006-11-21T00:00:00.000Z"),
            "v" : 10.313
        }, 
        {
            "d" : ISODate("2006-11-22T00:00:00.000Z"),
            "v" : 10.353
        }, 
        {
            "d" : ISODate("2006-11-23T00:00:00.000Z"),
            "v" : 10.376
        }, 
        {
            "d" : ISODate("2006-11-24T00:00:00.000Z"),
            "v" : 10.4
        }, 
        {
            "d" : ISODate("2006-11-27T00:00:00.000Z"),
            "v" : 10.406
        }, 
        {
            "d" : ISODate("2006-11-28T00:00:00.000Z"),
            "v" : 10.366
        }, 
        {
            "d" : ISODate("2006-11-29T00:00:00.000Z"),
            "v" : 10.43
        }, 
        {
            "d" : ISODate("2006-11-30T00:00:00.000Z"),
            "v" : 10.462
        }, 
        {
            "d" : ISODate("2006-12-01T00:00:00.000Z"),
            "v" : 10.498
        }
    ]
}

Я хочу рассчитать доходность за последнюю неделю в монго

1 Ответ

0 голосов
/ 24 марта 2019

Из-за того, как вы сохранили свои данные, любой запрос вернет весь этот объект. Теперь вам просто нужно запросить этот объект локально, используя выбранный вами язык программирования.

Чтобы заставить MongoDB выполнять свою работу, вам лучше хранить объекты даты и значения в качестве документов верхнего уровня, например

{
   "d" : ISODate("2006-11-14T00:00:00.000Z"),
   "v" : 10.0
}

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

db.col.find( { "d" : { "$gte" : ISODate("2006-11-29T00:00:00.000Z"), "$lte" :  ISODate("2006-12-01T00:00:00.000Z")}})

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

> match
{
    "$match" : {
        "d" : {
            "$gte" : ISODate("2006-11-29T00:00:00Z"),
            "$lte" : ISODate("2006-12-01T00:00:00Z")
        }
    }
}
> db.col.aggregate( [match, {"$group" : { "_id" : "range_sum", "total" : {"$sum": "$v"}}}])
{ "_id" : "range_sum", "total" : 31.39 }
>

Подробнее см. Документацию $ group .

Я рекомендую добавить index в поле d, чтобы сделать запрос эффективным.

...