Mongodb根据下标获取数组元素

Mongodb根据下标获取数组元素

总结一下MongoDB中通过下标获取数组元素的方法。

假设现在有一个score集合,里面有如下一些文档:

{
	"name" : "Jerry", 
	"score" : [98, 84, 62, 95, 100]
},
{
	"name" : "Tom", 
	"score" : [62, 53, 78, 42, 65]
},
...

现在要查询Jerry的记录,并获取其score的值。

一、$arrayElemAt获取单个元素

假如我们现在只需要第3次分数,即只取出score数组的第2个元素:

db.score.aggregate([
	{
		$match : {
			name : "Jerry"
		}
	},
	{
		$project : {
			name : 1, 
			a : {
				$arrayElemAt : ["$a", 2]
			}
		}
	}
])

查询结果:

{
    "_id" : ObjectId("605c454ebafbe07685f751a8"),
    "name" : "Jerry",
    "score" : 62
}

二、$slice获取多个连续元素

假如我们现在需要第3、4、5次的分数,即只取出score数组的第2、3、4个元素:

db.score.aggregate([
	{
		$match : {
			name : "Jerry"
		}
	},
	{
		$project : {
			name : 1, 
			score : {
				$slice : ["$score",2,3]
			}
		}
	}
])

其中,slice方法接收三个参数,分别为目标数组,起始下标和子数组长度,上述例子中 $slice : ["$score",2,3] 便是从score数组中下标为2的元素开始连续取出3个元素。注意数组起始下标可以为负数,即从后往前数,上述例子也可以写为 $slice : ["$score",-3,3] 即从倒数第三个元素开始取连续的三个元素。实际项目中可以根据实际场景灵活运用。

查询结果:

{
    "_id" : ObjectId("605c454ebafbe07685f751a8"),
    "name" : "Jerry",
    "score" : [ 
        62, 
        95, 
        100
    ]
}

三、 $map 配合 $arrayElemAt 获取多个不连续元素

假如我们现在需要第1、3、5次的分数,即只取出score数组的第0、2、4个元素呢?MongoDB并没有提供单独的方法实现这一操作,不过我们可以使用$map方法配合arrayElemAt实现。先看例子:

db.score.aggregate([
	{
		$match : {
			name : "Jerry"
		}
	},
	{
		$project : {
			name : 1, 
			score : {
				$map : {
					input : [0,2,4],
					as : "index",
					in : {
						$arrayElemAt : ["$score", "$$index"]
					}
				}
			}
		}
	}
])

$map操作符对数组所有元素进行同一操作。其接收三个参数 input 为目标数组,as 为数组的每个元素设置别名,默认为thisin为对元素进行的操作。

输出结果:

{
    "_id" : ObjectId("605c454ebafbe07685f751a8"),
    "name" : "Jerry",
    "score" : [ 
        98, 
        62, 
        100
    ]
}

参考


版权声明:本文为mayazure原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。