MongoDB: запрос агрегации для вложенного массива - PullRequest
0 голосов
/ 30 сентября 2019

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

{   '_id': ObjectId('5d8db3700a1650f211831f16'),
    'isuLists': [   {   'hgprc': 8100,
                        'isuSrtCd': '000020',
                        'lwprc': 8100,
                        'opnprc': 8100,
                        'trdPrc': 8100},
                    {   'hgprc': 0,
                        'isuSrtCd': '000040',
                        'lwprc': 0,
                        'opnprc': 0,
                        'trdPrc': 500},
                    {   'hgprc': 10050,
                        'isuSrtCd': '000050',
                        'lwprc': 10050,
                        'opnprc': 10050,
                        'trdPrc': 10050},
                     ...
                     similar data continues
                     ...
                    {   'hgprc': 0,
                        'isuSrtCd': '700001',
                        'lwprc': 0,
                        'opnprc': 0,
                        'trdPrc': 9305},
                    {   'hgprc': 3310,
                        'isuSrtCd': '900140',
                        'lwprc': 3310,
                        'opnprc': 3310,
                        'trdPrc': 3310}],
    'trdDd': '20190927',
    'trdTm': '090000'
},
...
{   '_id': ObjectId('5d8d51000a1650f211826c9a'),
    'isuLists': [   {   'hgprc': 8130,
                        'isuSrtCd': '000020',
                        'lwprc': 7880,
                        'opnprc': 8100,
                        'trdPrc': 7980},
                    {   'hgprc': 508,
                        'isuSrtCd': '000040',
                        'lwprc': 498,
                        'opnprc': 504,
                        'trdPrc': 500},
                    {   'hgprc': 10050,
                        'isuSrtCd': '000050',
                        'lwprc': 9720,
                        'opnprc': 10050,
                        'trdPrc': 9780},
                     ...
                     similar data continues
                     ...
                    {   'hgprc': 0,
                        'isuSrtCd': '700001',
                        'lwprc': 0,
                        'opnprc': 0,
                        'trdPrc': 9305},
                    {   'hgprc': 3310,
                        'isuSrtCd': '900140',
                        'lwprc': 3230,
                        'opnprc': 3265,
                        'trdPrc': 3300}],
    'trdDd': '20190927',
    'trdTm': '155959'
}

данные накапливаются каждые две секунды с 9:00 до 16:00 (посмотрите на trdTmвыше).

Мне удалось узнать временные метки opnprc и clsprc, используя код ниже, но я не смог найти временные метки самых высоких hgprc и самых низких lwprc.

 [
    {"$unwind": "$isuLists"},
    {"$match": {"isuLists.lwprc": {'$gt': 0}}},
    {
        '$group': {
            '_id': '$isuLists.isuSrtCd',
            'opnTm': {'$first': '$trdTm'},
            'clsTm': {'$last': '$trdTm'}
        }
    }
]

Я хочу найти trdTm (время торговли) самого высокого hgprc и самого низкого lwprc для каждого isuSrtCd (код выпуска).

Как мне найти следующий вывод?

{issue code(isuSrtCd), timestamp(trdTm) of the highest 'hgprc', timestamp(trdTm) of the lowest 'lwprc'} за каждый код проблемы

[
   {'_id': '000020', 'hgTm': '110233', 'lwTm': '135205'},
   {'_id': '000040', 'hgTm': '142411', 'lwTm': '095233'},
   {'_id': '000050', 'hgTm': '110255', 'lwTm': '140017'},
   ...
   {'_id': '900140', 'hgTm': '105931', 'lwTm': '095329'},
]

Спасибо за ваше время.

Ответы [ 2 ]

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

Следующий запрос может дать нам ожидаемый результат:

db.collection.aggregate([
    {
        $unwind:"$isuLists"
    },
    {
        $group:{
            "_id":"$isuLists.isuSrtCd",
            "min_stock":{
                $min:{
                    "lwprc":"$isuLists.lwprc",
                    "trdTm":"$trdTm"
                }
            },
            "max_stock":{
                $max:{
                    "hgprc":"$isuLists.hgprc",
                    "trdTm":"$trdTm"
                }
            }
        }
    },
    {
        $project:{
            "hgTm":"$max_stock.trdTm",
            "lwTm":"$min_stock.trdTm"
        }   
    }
]).pretty()

Набор данных:

{
    "_id" : ObjectId("5d8db3700a1650f211831f16"),
    "isuLists" : [
        {
            "hgprc" : 8100,
            "isuSrtCd" : "000020",
            "lwprc" : 8100,
            "opnprc" : 8100,
            "trdPrc" : 8100
        },
        {
            "hgprc" : 0,
            "isuSrtCd" : "000040",
            "lwprc" : 0,
            "opnprc" : 0,
            "trdPrc" : 500
        },
        {
            "hgprc" : 10050,
            "isuSrtCd" : "000050",
            "lwprc" : 10050,
            "opnprc" : 10050,
            "trdPrc" : 10050
        },
        {
            "hgprc" : 0,
            "isuSrtCd" : "700001",
            "lwprc" : 0,
            "opnprc" : 0,
            "trdPrc" : 9305
        },
        {
            "hgprc" : 3310,
            "isuSrtCd" : "900140",
            "lwprc" : 3310,
            "opnprc" : 3310,
            "trdPrc" : 3310
        }
    ],
    "trdDd" : "20190927",
    "trdTm" : "090000"
}
{
    "_id" : ObjectId("5d8d51000a1650f211826c9a"),
    "isuLists" : [
        {
            "hgprc" : 8130,
            "isuSrtCd" : "000020",
            "lwprc" : 7880,
            "opnprc" : 8100,
            "trdPrc" : 7980
        },
        {
            "hgprc" : 508,
            "isuSrtCd" : "000040",
            "lwprc" : 498,
            "opnprc" : 504,
            "trdPrc" : 500
        },
        {
            "hgprc" : 10050,
            "isuSrtCd" : "000050",
            "lwprc" : 9720,
            "opnprc" : 10050,
            "trdPrc" : 9780
        },
        {
            "hgprc" : 0,
            "isuSrtCd" : "700001",
            "lwprc" : 0,
            "opnprc" : 0,
            "trdPrc" : 9305
        },
        {
            "hgprc" : 3310,
            "isuSrtCd" : "900140",
            "lwprc" : 3230,
            "opnprc" : 3265,
            "trdPrc" : 3300
        }
    ],
    "trdDd" : "20190927",
    "trdTm" : "155959"
}
{
    "_id" : ObjectId("5d9331cef2e6411a68a145eb"),
    "isuLists" : [
        {
            "hgprc" : 8030,
            "isuSrtCd" : "000020",
            "lwprc" : 10,
            "opnprc" : 8100,
            "trdPrc" : 7980
        },
        {
            "hgprc" : 508,
            "isuSrtCd" : "000040",
            "lwprc" : 498,
            "opnprc" : 504,
            "trdPrc" : 500
        },
        {
            "hgprc" : 10050,
            "isuSrtCd" : "000050",
            "lwprc" : 9720,
            "opnprc" : 10050,
            "trdPrc" : 9780
        },
        {
            "hgprc" : 0,
            "isuSrtCd" : "700001",
            "lwprc" : 0,
            "opnprc" : 0,
            "trdPrc" : 9305
        },
        {
            "hgprc" : 3310,
            "isuSrtCd" : "900140",
            "lwprc" : 3230,
            "opnprc" : 3265,
            "trdPrc" : 3300
        }
    ],
    "trdDd" : "20190927",
    "trdTm" : "155960"
}

Выход:

{ "_id" : "900140", "hgTm" : "155960", "lwTm" : "155959" }
{ "_id" : "000020", "hgTm" : "155959", "lwTm" : "155960" }
{ "_id" : "700001", "hgTm" : "155960", "lwTm" : "090000" }
{ "_id" : "000040", "hgTm" : "155960", "lwTm" : "090000" }
{ "_id" : "000050", "hgTm" : "155960", "lwTm" : "155959" }
0 голосов
/ 30 сентября 2019

Прежде всего, время для highPrice и LowPrice может быть не уникальным. Это означает, что цена может быть высокой, и она может быть одинаковой для многих накоплений. Таким образом, это будет по сути массив.

Ниже приведен запрос, который фактически дает мне минимальное и максимальное значения lowPrice и HighPrice, а также массив массива timeStamps, когда цена была низкой или высокой.

 db.getCollection('trade').aggregate({"$unwind": "$isuLists"},
   {"$group":{
   "_id":"$isuLists.isuSrtCd",
   "minLowPrice":{$min:"$isuLists.lwprc"},
   "maxHighPrice":{$max:"$isuLists.hgprc"},
   "timeStamp":{"$push": 
   {date:"$trdDd",time:"$trdTm",highPrice:"$isuLists.hgprc",lowPrice:"$isuLists.lwprc"}}
   }},{"$project":
   {
   "sourceCode":"$_id",
   "lowPriceAndTime": { $filter:{input:"$timeStamp",as:"time",cond:{$eq: 
   ["$$time.lowPrice","$minLowPrice"]}}},
   "highPriceAndTime": { $filter:{input:"$timeStamp",as:"time",cond:{$eq: 
   ["$$time.highPrice","$maxHighPrice"]}}}
   }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...