On this page本页内容
$elemMatch
The $elemMatch
operator limits the contents of an <array>
field from the query results to contain only the first element matching the $elemMatch
condition.$elemMatch
运算符将查询结果中<array>
字段的内容限制为仅包含与$elemMatch
条件匹配的第一个元素。
Both the $
operator and the $elemMatch
operator project the first matching element from an array based on a condition.$
运算符和$elemMatch
运算符都根据条件从数组中投影第一个匹配元素。
The $
operator projects the first matching array element from each document in a collection based on some condition from the query statement.$
运算符根据查询语句中的某些条件,从集合中的每个文档投影第一个匹配的数组元素。
The $elemMatch
projection operator takes an explicit condition argument. $elemMatch
投影运算符采用显式条件参数。This allows you to project based on a condition not in the query, or if you need to project based on multiple fields in the array's embedded documents. 这允许您基于查询中没有的条件进行投影,或者如果需要基于数组嵌入文档中的多个字段进行投影,也可以进行投影。See Array Field Limitations for an example.有关示例,请参阅数组字段限制。
Starting in MongoDB 4.4, regardless of the ordering of the fields in the document, the 从MongoDB 4.4开始,无论文档中字段的顺序如何,现有字段的$elemMatch
projection of an existing field returns the field after the other existing field inclusions.$elemMatch
投影都会在其他现有字段包含后返回字段。
For example, consider a 例如,考虑一个包含以下文档的players
collection with the following document:players
集合:
db.players.insertOne( { name: "player1", games: [ { game: "abc", score: 8 }, { game: "xyz", score: 5 } ], joined: new Date("2020-01-01"), lastLogin: new Date("2020-05-01") } )
In version 4.4+, the following projection returns the 在4.4+版本中,以下投影在投影中包含的其他现有字段之后返回games
field after the other existing fields included in the projection even though in the document, the field is listed before joined
and lastLogin
fields:games
字段,即使在文档中,该字段在joined
和lastLogin
字段之前列出:
db.players.find( {}, { games: { $elemMatch: { score: { $gt: 5 } } }, joined: 1, lastLogin: 1 } )
That is, the operation returns the following document:即,操作返回以下文档:
{ "_id" : ObjectId("5edef64a1c099fff6b033977"), "joined" : ISODate("2020-01-01T00:00:00Z"), "lastLogin" : ISODate("2020-05-01T00:00:00Z"), "games" : [ { "game" : "abc", "score" : 8 } ] }
In version 4.2 and earlier, the 在4.2版和更早版本中,现有字段的$elemMatch
projection of an existing field upholds the ordering in the document:$elemMatch
投影支持文档中的顺序:
{ "_id" : ObjectId("5edef91e76ddff7d92f118e1"), "games" : [ { "game" : "abc", "score" : 8 } ], "joined" : ISODate("2020-01-01T00:00:00Z"), "lastLogin" : ISODate("2020-05-01T00:00:00Z") }
db.collection.find()
operations on views do not support $elemMatch
projection operator.db.collection.find()
操作不支持$elemMatch
投影运算符。$text
query expression in an $elemMatch
.$elemMatch
中指定$text
查询表达式。The examples on the $elemMatch
projection operator assumes a collection schools
with the following documents:$elemMatch
投影运算符上的示例假定集合schools
具有以下文档:
{ _id: 1, zipcode: "63109", students: [ { name: "john", school: 102, age: 10 }, { name: "jess", school: 102, age: 11 }, { name: "jeff", school: 108, age: 15 } ] } { _id: 2, zipcode: "63110", students: [ { name: "ajax", school: 100, age: 7 }, { name: "achilles", school: 100, age: 8 }, ] } { _id: 3, zipcode: "63109", students: [ { name: "ajax", school: 100, age: 7 }, { name: "achilles", school: 100, age: 8 }, ] } { _id: 4, zipcode: "63109", students: [ { name: "barney", school: 102, age: 7 }, { name: "ruth", school: 102, age: 16 }, ] }
The following 以下find()
operation queries for all documents where the value of the zipcode
field is 63109
. find()
操作查询zipcode
字段值为63109
的所有文档。The $elemMatch
projection returns only the first matching element of the students
array where the school
field has a value of 102
:$elemMatch
投影仅返回students
数组的第一个匹配元素,其中school
字段的值为102
:
db.schools.find( { zipcode: "63109" }, { students: { $elemMatch: { school: 102 } } } )
The operation returns the following documents that have 该操作返回zipcode
equal to 63109
and projects the students
array using $elemMatch
:zipcode
等于63109
的以下文档,并使用$elemMatch
投影学生数组:
{ "_id" : 1, "students" : [ { "name" : "john", "school" : 102, "age" : 10 } ] } { "_id" : 3 } { "_id" : 4, "students" : [ { "name" : "barney", "school" : 102, "age" : 7 } ] }
_id
equal to 1
, the students
array contains multiple elements with the school
field equal to 102
. _id
等于1
的文档,students
数组包含多个元素,school
字段等于102
。$elemMatch
projection returns only the first matching element from the array.$elemMatch
投影只返回数组中的第一个匹配元素。_id
equal to 3
does not contain the students
field in the result since no element in its students
array matched the $elemMatch
condition._id
等于3
的文档不包含结果中的students
字段,因为它的students
数组中没有元素匹配$elemMatch
条件。$elemMatch
The $elemMatch
projection can specify criteria on multiple fields:$elemMatch
投影可以在多个字段上指定条件:
The following 以下find()
operation queries for all documents where the value of the zipcode
field is 63109
. find()
操作查询zipcode
字段值为63109
的所有文档。The projection includes the first matching element of the 投影包括学生数组的第一个匹配元素,其中students
array where the school
field has a value of 102
and the age
field is greater than 10
:school
字段的值为102
,age
字段大于10
:
db.schools.find( { zipcode: "63109" }, { students: { $elemMatch: { school: 102, age: { $gt: 10} } } } )
The operation returns the three documents that have 该操作返回zipcode
equal to 63109
:zipcode
等于63109
的三个文档:
{ "_id" : 1, "students" : [ { "name" : "jess", "school" : 102, "age" : 11 } ] } { "_id" : 3 } { "_id" : 4, "students" : [ { "name" : "ruth", "school" : 102, "age" : 16 } ] }
The document with _id
equal to 3
does not contain the students
field since no array element matched the $elemMatch
criteria._id
等于3
的文档不包含students
字段,因为没有数组元素与$elemMatch
条件匹配。
$ (projection)
operator