首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >$projection对$elemMatch

$projection对$elemMatch
EN

Stack Overflow用户
提问于 2014-02-03 03:19:03
回答 2查看 8.9K关注 0票数 7

在功能上的区别是:

db.docs.find({ 'a.b': 'c' }, { 'a.$': 1 })

db.docs.find({ 'a.b': 'c' }, { 'a': { $elemMatch: { b: 'c' } } })

$elemMatch是多余的吗?索引将如何变化?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-03 04:33:05

投影使用上的差异有些微妙。在示例用法中,这些应该是等价的查询(就索引的使用而言),但是$elemMatch示例不必要地重复查询条件。对于这个例子,$投影将是一个更明智的选择。

文档中指出的一个基本区别是array field limitation for $预测:

由于查询文档中只能出现一个数组字段,如果数组包含文档,则使用$elemMatch运算符来指定这些文档的多个字段的条件。

关于下列投影运算符差异的进一步说明.

The ) projection operator

  • 将查询结果中包含的数组字段的内容限制为包含与查询文档匹配的第一个元素。
  • 要求在查询条件中包含匹配的数组字段。
  • 只能在查询条件中出现单个数组字段时使用。
  • 只能在投影中使用一次

The projection operator

  • 将查询结果中包含的数组字段的内容限制为只包含与$elemMatch条件匹配的第一个数组元素。
  • 不要求匹配数组在查询条件中。
  • 可用于匹配嵌入文档的数组元素的多个条件。

The query operator

注意,还有一个$elemMatch查询操作符,它执行类似的匹配,但是在查询中而不是结果投影中。将它与$投影结合使用并不少见。

借用一个可以同时使用example from the docs的:

代码语言:javascript
运行
复制
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 }
)
票数 10
EN

Stack Overflow用户

发布于 2014-02-03 04:26:29

如果您单独使用$elemMatch,在查找投影中,

$elemMatch不会过滤文档(条件不适用)

假设“学生”包含以下文档

代码语言:javascript
运行
复制
{ "_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 ] }
{
    "_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
        }
    ]
}

下面的查询将返回集合中的所有文档,

代码语言:javascript
运行
复制
db.students.find({},{ grades: { $elemMatch: { mean: 90 } } }  ).pretty()

下面的查询只返回匹配的记录。

代码语言:javascript
运行
复制
db.students.find({"grades.mean":90},{"grades.$":1}).pretty()

我希望索引在这两种查询中都不会有任何区别。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21519185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档