繁体   English   中英

在MongoDB中获取JSON数组的第n个项目

[英]Get the nth item of JSON array in MongoDB

使用MongoDb,您如何获取日期,以及如何从下方获取第三“ obs”?

 {   "data" : [
          {  "val" : [
                    {  "obs" : "2/3/2016"
                    }, 
                    {  "obs" : 41.8599992990494
                    }, 
                    {  "obs" : 41.3111999630928
                    }, 
                    {  "obs" : 5.048
                    }
                ]
            }, 
            {  "val" : [
                    {  "obs" : "2/4/2016"
                    },                
                    {  "obs" : 39.394998550415
                    }, 
                    {  "obs" : 41.8486998975277
                    }, 
                    {  "obs" : NumberInt(0)
                    }
                ]
            }, 
            { "val" : [
                    {  "obs" : "2/5/2016"
                    }, 
                    {  "obs" : NumberInt(0)
                    }, 
                    {  "obs" : 40.2090013027191
                    }, 
                    {  "obs" : 24.2410004138947
                    }, 
                    {  "obs" : 3.629
                    }
                ]
            }
        ]   
    }

从此开始:

 db.myColl.find({},{"_id":0, "data.val.obs": 1, })

想:

["2/3/2016", 41.3111], ["2/4/2016", 41.8486]      

从v 3.4开始,这是您如何在MongoDB中进行的操作

 db.getCollection('test').aggregate([ { $addFields: { data: { $map: { input: "$data", as: "item", in: {$concatArrays: [{$slice: ['$$item.val', 1]}, {$slice: ['$$item.val', 2, 1]}]} } } } } ]); 

所以基本上我使用$ addFields不会丢失根文档的其他属性(因为您可能需要它们)。 如果不需要它们,可以切换到$ project。

示例:收集记录如下所示: {_id: ..., data: [...], data_2: [...]} 如果按原样运行查询,则会过滤“数据”数组。 但是您仍然可以保持data_2不变。 如果将$ addFields替换为$ project,则会丢失data_2。 (或者您需要通过传递data_2来明确告诉mongo保留它:true)

然后,我映射了“数据”数组的每个元素,并将结果分配回“数据”数组,因此事实上,数据属性被过滤的数组覆盖。

为了获得第一和第三元素,我使用$ slice(每个$ slice返回一个包含一个文档的数组)。 然后,我通过$ concatArrays将它们加入单个数组中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM