📅  最后修改于: 2023-12-03 15:17:41.410000             🧑  作者: Mango
在MongoDB中,$arrayElemAt运算符允许您从数组中获取特定位置的元素。这可以用于查询数组中的特定元素或切片。本文将介绍MongoDB $arrayElemAt运算符的语法、用法和实例。
{ $arrayElemAt: [ <array>, <idx> ] }
参数:
使用 $arrayElemAt 运算符的基本语法如下:
db.collection.aggregate( [
{
$project: {
<field>: { $arrayElemAt: [ <array>, <idx> ] },
...
}
}
] )
其中,
arrayElemAt() 也可以用于查询操作,例如:
db.collection.find( { field: { $arrayElemAt: [ array, idx ] } } )
以上命令将找到所有具有数组字段的文档,该数组中具有指定位置的元素。
以下是使用 $arrayElemAt 运算符的一些实例:
假设我们有以下员工文档:
{
"_id" : "01",
"name" : "John",
"skills" : ["MongoDB", "NodeJS", "Javascript"]
},
{
"_id" : "02",
"name" : "Paul",
"skills" : ["Java", "Ruby", "PHP"]
},
{
"_id" : "03",
"name" : "George",
"skills" : ["Python", "Scala", "PHP"]
}
我们想要获取具有特定技能的员工的名称。例如,我们想要找到熟悉MongoDB的员工的名称。为了做到这一点,我们可以使用以下聚合查询:
db.employees.aggregate([
{ $match: { "skills": "MongoDB" } },
{ $project: { "_id": 0, "name": 1, "skill": { $arrayElemAt: ["$skills", 0] } } }
])
在此聚合查询中,我们使用 $match 来查找具有MongoDB技能的员工。然后,我们使用 $project 运算符来选择 _id 和 name 字段,并在 skill 字段中返回该员工的第一个技能。
假设我们有以下考试文档:
{
"_id": "01",
"student": "Alice",
"scores": [
{"type": "exam", "score": 78},
{"type": "quiz", "score": 93},
{"type": "homework", "score": 88}
]
},
{
"_id": "02",
"student": "Bob",
"scores": [
{"type": "exam", "score": 82},
{"type": "quiz", "score": 77},
{"type": "homework", "score": 99}
]
},
{
"_id": "03",
"student": "Charlie",
"scores": [
{"type": "exam", "score": 88},
{"type": "quiz", "score": 99},
{"type": "homework", "score": 65}
]
}
我们想要获取每个学生的最高分和次高分。为了完成此操作,我们可以使用以下聚合查询:
db.exams.aggregate([
{ $unwind: "$scores" },
{ $sort: { "scores.score": -1 } },
{ $group: {
"_id": "$_id",
"student": { $first: "$student" },
"topScore": { $arrayElemAt: ["$scores.score", 0] },
"secondScore": { $arrayElemAt: ["$scores.score", 1] }
} }
])
在此聚合查询中,我们首先使用 $unwind 运算符展开 scores 数组,以便我们可以对每个分数进行排序。然后,我们使用 $sort 来根据分数按降序排序。接下来,我们使用 $group 运算符来将每个文档分组,并使用 $first 来获取我们想要的学生名字。最后,我们使用 $arrayElemAt 运算符来获取每个学生的最高分和次高分。
$arryElemAt 运算符是一个有用的工具,可以帮助您从具有嵌套数组的MongoDB文档中检索子集。无论您需要获取一个特定位置的元素,还是从数组中获取一组元素,$arrayElemAt 运算符都可以帮助您快速、轻松地完成此操作。