$ 的聚合版本,选择数组第一个元素的位置运算符

问题描述 投票:0回答:1

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
等效的东西?

mongodb mongodb-query aggregation-framework
1个回答
0
投票

你问错了问题。

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" } } } 
)
© www.soinside.com 2019 - 2024. All rights reserved.