$ (projection)

在本页面

Definition

如果在选定的文档中只需要一个特定的数组元素,请在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 需要满足以下条件:

在这些要求下,以下查询是 不正确

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字段是文档数组;每个文档包含三个字段名称grademeanstd

{ "_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 } ] }

Further Reading

$elemMatch (projection)

首页