跨两个阵列查询Mongo

时间:2013-10-15 18:34:23

标签: mongodb

假设我有以下文档结构:

{ _id : 1,
  items: [ {n: "Name", v: "Kevin"}, ..., {n: "Age", v: 100} ],
  records : [ {n: "Environment", v: "Linux"}, ... , {n: "RecordNumber, v: 555} ]
}

如果我在items.n-items.vrecords.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是否可行。

1 个答案:

答案 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不会对并行数组编制索引,因为它们要求索引在复合键的笛卡尔积中包含每个值,这很快就会导致索引非常大且难以维护。