извлекать значения из поля после поиска по запросу mongodb - PullRequest
0 голосов
/ 03 июня 2019

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

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

{
    "status": "ok",
        "data": {
        "aqi": 48,
            "idx": 8495,
                "attributions": [
                    {
                        "url": "http://www.juntadeandalucia.es/medioambiente/site/portalweb/",
                        "name": "Consejería de Medio Ambiente y Ordenación del Territorio :: Junta de Andalucía"
                    },
                    {
                        "url": "http://www.eea.europa.eu/themes/air/",
                        "name": "European Environment Agency"
                    },
                    {
                        "url": "https://waqi.info/",
                        "name": "World Air Quality Index Project"
                    }
                ],
                    "city": {
            "geo": [
                37.3485317,
                -5.9877044
            ],
                "name": "Bermejales, Sevilla, Spain",
                    "url": "https://aqicn.org/city/spain/andalucia/sevilla/bermejales"
        },
        "dominentpol": "o3",
            "iaqi": {
            "co": {
                "v": 3.2
            },
            "no2": {
                "v": 2.8
            },
            "o3": {
                "v": 47.6
            },
            "p": {
                "v": 1012.1
            },
            "pm10": {
                "v": 4
            },
            "so2": {
                "v": 2.6
            },
            "w": {
                "v": 6.7
            }
        },
        "time": {
            "s": "2019-05-14 12:00:00",
                "tz": "+02:00",
                    "v": 1559487600
        },
        "debug": {
            "sync": "2019-05-14T11:38:05+09:00"
        }
    }
}

Что мне нужно сделать, это извлечь значение полей "data.time.s" и "data.iaqi.co.v" (для каждого документа в коллекции) между двумя точными датами и объединить их в новый массив с такой точной структурой:

Пример:
"Получить все значения " co " поле между датами " 2019-05-14 " и " 2019-05-29"

Окончательный результат:
Дата, значение
2019-05-14 12: 00: 00,3.2
2019-05-15 00: 00: 00,14.5
2019-05-17 05: 00: 00,1
2019-05-19 20: 00: 00,2,3
2019-05-28 08: 00: 00,33.4
2019-05-28 10: 00: 00,18,8
2019-05-28 12: 00: 00,11,5
2019-05-28 13: 00: 00,12.4
2019-05-29 06: 00: 00,6.4

Я пытался найти этот вопрос, но не нашел ничего связанного.

Самое большое, чего я достиг, - это получение двух полей, необходимых с помощью оператора поиска:

db.getCollection("prueba2").find(
    { 
        "data.time.s" : {
            "$gte" : "2019-05-14", 
            "$lte" : "2019-05-29"
        }
    }, 
    { 
        "data.iaqi.co.v" : "$data.iaqi.co.v", 
        "data.time.s" : "$data.time.s", 
        "_id" : NumberInt(0)
    }
);

Но с помощью этой операции я получаю также всю структуру из родительских полей:

{ 
    "data" : {
        "iaqi" : {
            "co" : {
                "v" : 3.2
            }
        }, 
        "time" : {
            "s" : "2019-05-14 12:00:00"
        }
    }
}
// ----------------------------------------------
{ 
    "data" : {
        "iaqi" : {
            "co" : {
                "v" : 14.5
            }
        }, 
        "time" : {
            "s" : "2019-05-15 00:00:00"
        }
    }
}
// ----------------------------------------------
etc etc etc

Я не совсем уверен, что окончательный результат, который мне нужно получить, может быть достигнут всего одной операцией запроса MongoDB, может быть, мне нужно сначала извлечь данные так, как я это сделал, а затем работать с этим JSON в Javascript иметь второе извлечение этих полей для генерации окончательного документа с той «чистой» конечной структурой вывода, которая мне нужна.

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

Большое спасибо

1 Ответ

0 голосов
/ 03 июня 2019

Есть несколько способов сделать это, но у всех методов будет две операции.

Первый подход: написать сценарий можно в python / java, который читает два значения, выполняет создание необходимого массива и обновляет документ.

Второй подход: используйте предложение forEach для mongo javascript, прочитайте все данные и выполните обновления.

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

...