两者之间的功能区别是什么:
db.docs.find({ 'a.b': 'c' }, { 'a.$': 1 })
和
db.docs.find({ 'a.b': 'c' }, { 'a': { $elemMatch: { b: 'c' } } })
$ elemMatch是多余的吗?指数会如何变化?
Ste*_*nie 10
投影使用的差异有些微妙.在您的示例用法中,这些应该是等效的查询(就索引使用而言),但该$elemMatch示例不必要地重复查询条件.$对于这个例子,投影将是更明智的选择.
在文档中指出的一个重要区别是阵列场限制为$推算:
由于查询文档中只能出现一个数组字段,如果数组包含文档,要在这些文档的多个字段上指定条件,请使用$ elemMatch运算符.
关于以下投影算子差异的进一步说明......
$)投影算子:限制查询结果中包含的数组字段的内容,以包含与查询文档匹配的第一个元素.
要求匹配的数组字段包含在查询条件中
只有在查询条件中出现单个数组字段时才能使用
只能在投影中使用一次
$elemMatch投影算限制查询结果中包含的数组字段的内容,以仅包含与$ elemMatch条件匹配的第一个数组元素.
不要求匹配数组在查询条件中
可用于匹配嵌入文档的数组元素的多个条件
$elemMatch查询操作请注意,还有一个$elemMatch查询运算符执行类似的匹配,但在查询中而不是结果投影.看到这与$投影结合使用并不罕见.
db.students.find(
// use $elemMatch query operator to match multiple criteria in the grades array
{ grades: {
$elemMatch: {
mean: { $gt: 70 },
grade: { $gt: 90 }
}
}},
// use $ projection to get the first matching item in the "grades" array
{ "grades.$": 1 }
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8228 次 |
| 最近记录: |