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

时间:2017-02-26 16:36:38

标签: json mongodb

使用MongoDb你怎么回到日期,从下面回来第3个“obs”?

Dialog myDialog = CustomDialog.createDialog(this); 
myDialog.show();

从此开始:

public static Dialog createDialog(Context context) {
    Dialog dialog = new Dialog(this);
    //do all the initialization stuff

    //return the dialog
    return dialog;
}

希望:

 {   "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
                    }
                ]
            }
        ]   
    }

1 个答案:

答案 0 :(得分:1)

以下是从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不变。如果用$ project替换$ addFields,你将丢失data_2。 (或者你需要通过传递data_2明确告诉mongo保留它:true)

然后我映射'data'数组的每个元素并将结果分配回'data'数组,所以实际上data过滤了数组属性。

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