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
为数组的每个元素设置别名,默认为this
,in
为对元素进行的操作。
输出结果:
{
"_id" : ObjectId("605c454ebafbe07685f751a8"),
"name" : "Jerry",
"score" : [
98,
62,
100
]
}
参考
版权声明:本文为mayazure原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。