以下是我的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运算符的查询必须扫描 与查询数组中第一个元素匹配的所有文档。如 结果,即使有索引支持查询,操作也可以 长时间运行,特别是当数组中的第一个元素是 不是很有选择性。
我的查询有更好的选择吗?
答案 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})
希望这有帮助。