在mongodb查询搜索之后从字段中提取值

时间:2019-06-03 08:44:07

标签: arrays mongodb search extract

我对MongoDB和一般的编程语言还很陌生,不确定如何实现以下目标:

我有一个mongodb Collection,其中包含许多类似于以下文档的文档,并且它们都具有相同的结构,只是在某些字段中改变了一些值:

{
    "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” (对于集合中的每个文档)在两个确切的日期之间,然后将它们放到具有此确切结构的新数组中

示例:
“获取日期 “ 2019-05-14” 之间的 “ co” 字段的所有值“ 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

我尝试搜索此问题,但未找到任何相关内容。

我所能到达的最遥远的地方是使用find运算符获取了两个字段:

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查询操作就可以实现所需的最终输出,也许我需要首先按照我的方式提取数据,然后在Javascript中使用该JSON对这些字段进行第二次提取,以生成具有我所需的“干净”最终输出结构的最终文档。

如果有人知道如何实现这一目标,我相信将来会有很多人需要解决方案。

非常感谢

1 个答案:

答案 0 :(得分:0)

有多种方法可以执行此操作,但是所有方法都将有两个操作。

第一种方法:编写脚本可能是在python / java中,该脚本读取两个值以执行所需的数组创建并更新文档。

第二种方法:使用mongo javascript的forEach子句并读取所有数据并执行更新。

我的建议是,如果这也是您对新数据也需要的,最好编写一个脚本在内存中执行操作,然后插入MongoDB中。 这样会更快,更轻松。

相关问题