https://www.mongodb.com/docs/manual/reference/operator/projection/positional/
{ "_id" : 1, "semester" : 1, "grades" : [ 70, 87, 90 ] }
{ "_id" : 2, "semester" : 1, "grades" : [ 90, 88, 92 ] }
{ "_id" : 3, "semester" : 1, "grades" : [ 85, 100, 90 ] }
{ "_id" : 4, "semester" : 2, "grades" : [ 79, 85, 80 ] }
{ "_id" : 5, "semester" : 2, "grades" : [ 88, 88, 92 ] }
{ "_id" : 6, "semester" : 2, "grades" : [ 95, 90, 96 ] }
db.students.find( { semester: 1, grades: { $gte: 85 } },
{ "grades.$": 1 } )
{ "_id" : 1, "grades" : [ 87 ] }
{ "_id" : 2, "grades" : [ 90 ] }
{ "_id" : 3, "grades" : [ 85 ] }
通过在查找查询中添加
{ "grades.$": 1 } )
位,结果将返回匹配文档的 Grades 数组的第一个元素。
对于
$match
阶段,是否有与聚合管道 $elemMatch
等效的东西?
你问错了问题。
find()
运算符是
db.collection.find(query, projection, options)
与
db.students.find(
{ semester: 1, grades: { $gte: 85 } },
{ "grades.$": 1 }
)
位置运算符指的是
projection
,而不是匹配条件。
除此之外,位置 1 表示第二个元素,而不是第一个。
使用聚合管道,相当于
db.students.aggregate(
{ $match: { semester: 1, grades: { $gte: 85 } } },
{ $project: { grades: { $arrayElemAt: [ "$grades", 0 ] } } }
)
或更短一点:
db.students.aggregate(
{ $match: { semester: 1, grades: { $gte: 85 } } },
{ $project: { grades: { $first: "$grades" } } }
)