On this page
$ (projection)
在本页面
Definition
$
- 位置$运算符将查询结果中
<array>
的内容限制为仅包含与查询文档匹配的 first 元素。要指定要更新的数组元素,请参见位置$运算符以进行更新。
- 位置$运算符将查询结果中
如果在选定的文档中只需要一个特定的数组元素,请在find()方法或findOne()方法的projection文档中使用$。
请参见聚合运算符$filter,以返回仅包含那些与指定条件匹配的元素的数组。
Usage Considerations
$运算符和$elemMatch运算符都基于条件从数组投影 first 匹配元素。
$运算符根据查询语句中的某些条件从集合中的每个文档中投影第一个匹配的数组元素。
$elemMatch投影运算符采用显式条件参数。这使您可以根据查询中没有的条件进行投影,或者如果需要基于阵列的嵌入式文档中的多个字段进行投影。有关示例,请参见数组字段限制。
views上的db.collection.find()个操作不支持$个投影运算符。
Behavior
Usage Requirements
给定形式:
db.collection.find( { <array>: <value> ... },
{ "<array>.$": 1 } )
db.collection.find( { <array.field>: <value> ...},
{ "<array>.$": 1 } )
限制<array>
的字段必须出现在query document中,并且<value>
可以是包含查询运算符表达式的文档。
数组字段限制
在处理数组投影时,MongoDB 需要满足以下条件:
投影文档中只能出现一个位置$运算符。
只有一个数组字段(该字段受$投影运算符限制)应出现在query document中。查询文档中的其他数组字段可能导致未定义的行为。
query document仅应在要投影的数组字段上包含一个条件。多个条件可能在内部相互覆盖并导致不确定的行为。
在这些要求下,以下查询是 不正确 :
db.collection.find( { <array>: <value>, <someOtherArray>: <value2> },
{ "<array>.$": 1 } )
要在该数组内的文档的多个字段上指定条件,请使用$elemMatch查询运算符。以下查询返回grades
数组中的第一个文档,该数组具有mean
大于 70 和grade
大于 90.
db.students.find( { grades: { $elemMatch: {
mean: { $gt: 70 },
grade: { $gt:90 }
} } },
{ "grades.$": 1 } )
如果需要单独的条件来选择文档以及在这些文档中选择字段,则必须使用$elemMatch运算符。
排序和位置运算符
当find()方法包括sort()时,find()方法应用sort()来对匹配的文档进行排序, 在 之前,它应用位置$投影运算符。
如果数组字段包含多个具有相同字段名的文档,并且find()方法在该重复字段上包含sort(),则返回的文档可能不反映排序 Sequences,因为排序是在$投影运算符之前应用于数组的元素。
Examples
项目数组值
集合students
包含以下文档:
{ "_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 ] }
在以下查询中,投影{ "grades.$": 1 }
仅针对grades
字段返回大于或等于85
的第一个元素。
db.students.find( { semester: 1, grades: { $gte: 85 } },
{ "grades.$": 1 } )
该操作返回以下文档:
{ "_id" : 1, "grades" : [ 87 ] }
{ "_id" : 2, "grades" : [ 90 ] }
{ "_id" : 3, "grades" : [ 85 ] }
尽管数组字段grades
可以包含多个大于或等于85
的元素,但是$投影运算符仅返回数组中的第一个匹配元素。
项目阵列文件
students
集合包含以下文档,其中grades
字段是文档数组;每个文档包含三个字段名称grade
,mean
和std
:
{ "_id" : 7, semester: 3, "grades" : [ { grade: 80, mean: 75, std: 8 },
{ grade: 85, mean: 90, std: 5 },
{ grade: 90, mean: 85, std: 3 } ] }
{ "_id" : 8, semester: 3, "grades" : [ { grade: 92, mean: 88, std: 8 },
{ grade: 78, mean: 90, std: 5 },
{ grade: 88, mean: 85, std: 3 } ] }
在以下查询中,对于grades
字段,投影{ "grades.$": 1 }
仅返回mean
大于70
的第一个元素:
db.students.find(
{ "grades.mean": { $gt: 70 } },
{ "grades.$": 1 }
)
该操作返回以下文档:
{ "_id" : 7, "grades" : [ { "grade" : 80, "mean" : 75, "std" : 8 } ] }
{ "_id" : 8, "grades" : [ { "grade" : 92, "mean" : 88, "std" : 8 } ] }