$elemMatch(查询)
定义
$elemMatch
$elemMatch
操作符匹配包含数组字段的文档,其中至少有一个元素匹配所有指定查询条件。
兼容性
可以使用 $elemMatch
查找托管在以下环境中的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
{ <field>: { $elemMatch: { <query1>, <query2>, ... } } }
行为
您不能在
$elemMatch
中指定$where
表达式。无法在
$elemMatch
中指定$text
查询表达式。
示例
元素匹配
以 scores
集合中的以下文档为例:
{ _id: 1, results: [ 82, 85, 88 ] } { _id: 2, results: [ 75, 88, 89 ] }
以下查询仅匹配 results
数组中至少包含一个大于或等于 80
且小于 85
的元素的文档:
db.scores.find( { results: { $elemMatch: { $gte: 80, $lt: 85 } } } )
由于元素 82
既大于或等于 80
又小于 85
,因而此查询会返回以下文档:
{ "_id" : 1, "results" : [ 82, 85, 88 ] }
有关在数组元素上指定多个条件的更多信息,请参阅为数组元素指定多个条件。
嵌入式文档数组
此语句将文档插入到 survey
集合中:
db.survey.insertMany( [ { "_id": 1, "results": [ { "product": "abc", "score": 10 }, { "product": "xyz", "score": 5 } ] }, { "_id": 2, "results": [ { "product": "abc", "score": 8 }, { "product": "xyz", "score": 7 } ] }, { "_id": 3, "results": [ { "product": "abc", "score": 7 }, { "product": "xyz", "score": 8 } ] }, { "_id": 4, "results": [ { "product": "abc", "score": 7 }, { "product": "def", "score": 8 } ] }, { "_id": 5, "results": { "product": "xyz", "score": 7 } } ] )
_id
为 5
的文档不包含数组。包含该文档以表明 $elemMatch
仅匹配数组元素,您将在以下示例中看到这些元素。
以下查询匹配 results
中至少包含一个 product
等于 "xyz"
且 score
大于或等于 8
的元素的文档:
db.survey.find( { results: { $elemMatch: { product: "xyz", score: { $gte: 8 } } } } )
具体而言,该查询与以下文档匹配:
{ "_id" : 3, "results" : [ { "product" : "abc", "score" : 7 }, { "product" : "xyz", "score" : 8 } ] }
单一查询条件
以下部分显示了在使用 $elemMatch
与单个查询条件时的输出差异,并省略了 $elemMatch
。
示例 1
带 $elemMatch
的查询:
db.survey.find( { results: { $elemMatch: { product: "xyz" } } } )
此查询会返回 results
中的任一 product
为 "xyz"
的文档:
[ { _id: 1, results: [ { product: 'abc', score: 10 }, { product: 'xyz', score: 5 } ] }, { _id: 2, results: [ { product: 'abc', score: 8 }, { product: 'xyz', score: 7 } ] }, { _id: 3, results: [ { product: 'abc', score: 7 }, { product: 'xyz', score: 8 } ] } ]
不带 $elemMatch
的查询:
db.survey.find( { "results.product": "xyz" } )
在以下输出中,请注意还包括 _id
为 5
的文档(不包含数组):
[ { _id: 1, results: [ { product: 'abc', score: 10 }, { product: 'xyz', score: 5 } ] }, { _id: 2, results: [ { product: 'abc', score: 8 }, { product: 'xyz', score: 7 } ] }, { _id: 3, results: [ { product: 'abc', score: 7 }, { product: 'xyz', score: 8 } ] }, { _id: 5, results: { product: 'xyz', score: 7 } } ]
示例 2
考虑以下查询:
第一个查询在
$elemMatch
中只有一个<query>
条件。第二次查询省略了
$elemMatch
。
带 $elemMatch
的第一个查询:
db.survey.find( { "results": { $elemMatch: { product: { $ne: "xyz" } } } } )
查询返回 product
值不是 "xyz"
的文档:
{ "_id" : 1, "results" : [ { "product" : "abc", "score" : 10 }, { "product" : "xyz", "score" : 5 } ] } { "_id" : 2, "results" : [ { "product" : "abc", "score" : 8 }, { "product" : "xyz", "score" : 7 } ] } { "_id" : 3, "results" : [ { "product" : "abc", "score" : 7 }, { "product" : "xyz", "score" : 8 } ] } { "_id" : 4, "results" : [ { "product" : "abc", "score" : 7 }, { "product" : "def", "score" : 8 } ] }
不带 $elemMatch
的第二次查询:
db.survey.find( { "results.product": { $ne: "xyz" } } )
此查询会返回任一 product
results
均不为 "xyz"
的文档:
{ "_id" : 4, "results" : [ { "product" : "abc", "score" : 7 }, { "product" : "def", "score" : 8 } ] }
这两个查询均包含 _id
为 4
的文档,并省略 _id
为 5
的文档,因为 product
为 "xyz"
。
了解详情
有关查询数组的其他示例,请参阅:
有关查询的其他示例,请参阅查询文档。