首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取MongoDB中JSON数组的第n项

获取MongoDB中JSON数组的第n项
EN

Stack Overflow用户
提问于 2017-02-27 00:36:38
回答 1查看 198关注 0票数 0

使用MongoDb如何从下面取回日期和第三个"obs“?

代码语言:javascript
复制
 {   "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
                    }
                ]
            }
        ]   
    }

从这个开始:

代码语言:javascript
复制
 db.myColl.find({},{"_id":0, "data.val.obs": 1, })

想要:

代码语言:javascript
复制
["2/3/2016", 41.3111], ["2/4/2016", 41.8486]      
EN

回答 1

Stack Overflow用户

发布于 2017-02-27 01:53:42

以下是从v3.4开始在MongoDB中执行此操作的方法

代码语言:javascript
复制
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”数组。但是你仍然会保持data_2不变。如果你用$project替换$addFields,你将失去data_2 (或者你需要通过传递data_2: true显式地告诉mongo保留它)

然后我映射' data‘数组的每个元素,并将结果分配回'data’数组,这样实际上data属性就被过滤过的数组覆盖了。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42471156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档