$ projection vs $ elemMatch

pau*_*kon 7 mongodb

两者之间的功能区别是什么:

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)