动态嵌套键上的索引是否在mongodb中工作?

时间:2013-06-16 14:12:13

标签: mongodb

在PHP中使用以下查询:

$where = array(
     "subs.{$pid}.opt"    => $subsType,
     "partner.{$pid}.lts" => array(
          '$exists' => true
     )
);

因此,在我的情况下,“subs”&的子键。 “伙伴”可以是一些符号($ pid),在不同条件下有所不同!

我发现,这样的查询很慢,因为我的集合中有很多数据。

我试图通过创建索引来解决这个问题:

  1. “subs”+“partner”的复合索引
  2. “subs。$。opt”+“partner。$。lts”
  3. 的复合索引
  4. 也尝试在那些字段上创建一个索引......
  5. 但是,这些尝试都没有成功(我在查询中做了“解释”,并且发现在所有情况下都没有使用索引)。

    所以,我的问题:我做错了什么?是否有可能在动态更改的密钥上创建索引? 或者我应该考虑改变保存数据的方式? (数据结构)

    祝福!

1 个答案:

答案 0 :(得分:0)

在原始模式中,每个嵌入对象在文档中创建一个唯一的字段路径,因此我们无法有效地索引这些路径。可以在this presentation中找到这些索引限制的简要说明(以及重构一个特定案例的示例)。

在您的情况下,您可能会受益于类似于this question的分类模式,我今天早些时候回答过。 MongoDB Content Taxonomy Schema为需要与记录关联的任意键/值对的模式提供了一个很好的建议。此外,它描述了创建复合,多键索引(在同一阵列中的两个嵌入字段上)并使用$elemMatch按键/值对进行查询。这个例子需要一个对象数组,每个对象都有一个键和值字段。

另一种模式可以是一个字符串数组(例如["key1=value1", "key2=value2"]),Derick Rethans在他的博客文章中使用了Importing OpenStreetMap data into MongoDB。如果您的键和值都是字符串,我建议使用此模式,但上述分类模式可能更适合非字符串值。