假设我有以下文档结构:
{ _id : 1,
items: [ {n: "Name", v: "Kevin"}, ..., {n: "Age", v: 100} ],
records : [ {n: "Environment", v: "Linux"}, ... , {n: "RecordNumber, v: 555} ]
}
如果我在items.n-items.v
和records.n-records.v
上创建2个复合索引,我可以执行$all
查询:
db.collection.find( {"items" : {$all : [{ $elemMatch: {n: "Name", v: "Kevin"} },
{$elemMatch: {n: "Age", v: 100} } ]}})
我也可以在records
上执行类似的搜索。
db.collection.find( {"records" : {$all : [{ $elemMatch: {n: "Environment", v: "Linux"} },
{$elemMatch: {n: "RecordNumber", v: 555} } ]}})
我可以以某种方式执行使用索引来搜索基于项和记录字段的文档的查询吗?
查找item.n =“Name”和item.v =“Kevin”AND record.n =“RecordNumber”和record.v = 100
的所有文件
我不确定使用$all
是否可行。
答案 0 :(得分:2)
您可以使用索引在一个阵列上查询,但不能同时在两个阵列上查询。根据{{3}},While you can create multikey compound indexes, at most one field in a compound index may hold an array
。
实际上:
Compound
索引来索引多个字段。Multikey
索引来索引数组的所有元素。Multikey
索引作为compound
索引multikey
索引中使用多个 compound
索引文档清楚地说明了这个原因:
MongoDB不会对并行数组编制索引,因为它们要求索引在复合键的笛卡尔积中包含每个值,这很快就会导致索引非常大且难以维护。