使用$ elemMatch比$ all更好的选择

时间:2013-10-21 02:08:56

标签: mongodb

以下是我的Mongo数据库结构的示例文档:

{ _id: 1
  records: [{n: "Name", v: "Kevin"}, 
            {n: "Age", v: "100"}, 
             ..., 
            {n: "Field25", v: "Value25"} ]
}

要搜索所有Name of "Kevin" and an Age of "100"的文档,我将 $ all $ elemMatch 一起使用。我需要使用$ elemMatch来进行n:“Name”和v:“Kevin”以及$ all的精确子文档匹配,因为我在查询数组

db.collection.find({"records" : { $all: [
                                         {$elemMatch: {n: "Name", v: "Kevin"},
                                         {$elemMatch: {n: "Age", v: "100"}
                                        ]}})

但是,当第一个$ elemMatch参数是非选择性的时,$ all运算符效率低,即有许多文档与此字段匹配。

Mongo Docs详细说明:

  

在当前版本中,使用$ all运算符的查询必须扫描   与查询数组中第一个元素匹配的所有文档。如   结果,即使有索引支持查询,操作也可以   长时间运行,特别是当数组中的第一个元素是   不是很有选择性。

我的查询有更好的选择吗?

1 个答案:

答案 0 :(得分:1)

我建议对您的结构进行彻底更改,这样可以简化查询。很抱歉,如果无法进行此更改,但没有更多数据,我认为没有任何问题:

{ _id: 1
  records: [{"Name":"Kevin", 
            "Age":"100", 
             ..., 
            "Field25":"Value25"} ]
}

查询:

db.collection.find("records":{$elemMatch:{Name:"Kevin","Age":100}})

这将返回所有具有记录的对象(假设有更多记录,例如,如果他们是班级的学生)匹配所有提及的条件

如果您想要每个_id 一个文档,请忘记记录数组:

{ _id: 1,
 "Name":"Kevin", 
 "Age":"100", 
   ..., 
 "Field25":"Value25"} ]
    }

和查询:

db.collection.find({Name:"Kevin","Age":100})

希望这有帮助。