1

在 PHP 中有以下查询:

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

所以,在我的例子中,“subs”和“partner”的子键可以是一些符号($pid),在不同的条件下不同!

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

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

  1. “subs”+“partner”的复合索引
  2. “subs.$.opt”+“partner.$.lts”上的复合索引
  3. 另外,尝试在该字段上创建单个索引...

但是,这些尝试都没有成功(我确实“解释”了我的查询,并看到在所有情况下都没有使用索引)。

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

最好的祝愿!

4

1 回答 1

0

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

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

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

于 2013-06-27T20:40:23.213 回答