Группа MongoDB затем сортировать по расчету - PullRequest
0 голосов
/ 01 марта 2019

Каждая запись в моем mongoDB имеет вид

{"_id" : date,
"tickers" = [{"ticker": ticker, "open": open, "close":close}]

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

db.stocks.aggregate([
  {$unwind: '$tickers'},
  {"$sort": {"_id": 1, "tickers.open": -1}},
  {"$group": {
    "_id": "_id",
    "ticker": { "$first": "$tickers.ticker"},
    "open": { "$first": "$tickers.open" },
    "close": { "$first": "$tickers.close" }
    }}
])

Ниже приведен пример записи 252 в БД

   {
    "_id" : "19990726",
    "tickers" : [
        {
            "ticker" : "luk",
            "close" : 5.96998,
            "open" : 6.07182
        },
        {
            "ticker" : "cce",
            "close" : 15.0793,
            "open" : 15.2627
        },
        {
            "ticker" : "bac",
            "close" : 22.4244,
            "open" : 21.9815
        },
        {
            "ticker" : "cci",
            "close" : 24.5,
            "open" : 24.19
        },
        {
            "ticker" : "kss",
            "close" : 35.7964,
            "open" : 36.3512
        },
        {
            "ticker" : "luv",
            "close" : 13.0781,
            "open" : 13.2789
        },
        {
            "ticker" : "mwv",
            "close" : 16.5388,
            "open" : 17.0901
        }
    ]
}

, и когда я выполняю свой запрос, я получаю только

{ "_id" : "_id", "ticker" : "aig", "open" : 812.485, "close" : 829.651 }

Когда ядолжна возвращать одну запись для каждого «_id» плюс один элемент из подмассива «tickers» для этой записи, содержащей тикер с максимальным открытием.

Когда я пытаюсь изменить теперь работающий запрос, я путаю синтаксис для вычисления вложенности, чтобы вычислить изменение дня, а не макс.Может ли кто-нибудь помочь мне правильно их вложить?

    db.stocks.aggregate([
  {$unwind: '$tickers'},
  {"$sort": {"_id": 1, {$abs: { 1 - $divide: [ "$tickers.close", "$tickers.open" ] }}: -1}},
  {"$group": {
    "_id": "$_id",
    "ticker": { "$first": "$tickers.ticker"},
    "open": { "$first": "$tickers.open" },
    "close": { "$first": "$tickers.close" }
    }}
]);

1 Ответ

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

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

Путь к полю и системные переменные : выражения агрегации используют путь к полю для доступаполя во входных документах.Чтобы указать путь к полю, используйте строку с префиксом со знаком доллара $ имя поля или пунктирное имя поля, если поле находится во встроенном документе.Например, «$ user» для указания пути к полю для пользователя или «$ user.name» для указания пути к полю «user.name».

«$» эквивалентно «$$ CURRENT».где CURRENT - системная переменная, которая по умолчанию имеет корень текущего объекта на большинстве этапов, если не указано иное на определенных этапах.CURRENT может быть восстановлен.

Для того чтобы ваш запрос работал, вам нужно сослаться, используя $, например $_id.

db.stocks.aggregate([
  {$unwind: '$tickers'},
  {"$sort": {"_id": 1, "tickers.open": -1}},
  {"$group": {
    "_id": "$_id",
    "ticker": { "$first": "$tickers.ticker"},
    "open": { "$first": "$tickers.open" },
    "close": { "$first": "$tickers.close" }
    }}
]);

Вы можете увидеть примеры$group _id в документации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...