在PHP中使用以下查询:
$where = array(
"subs.{$pid}.opt" => $subsType,
"partner.{$pid}.lts" => array(
'$exists' => true
)
);
因此,在我的情况下,“subs”&的子键。 “伙伴”可以是一些符号($ pid),在不同条件下有所不同!
我发现,这样的查询很慢,因为我的集合中有很多数据。
我试图通过创建索引来解决这个问题:
但是,这些尝试都没有成功(我在查询中做了“解释”,并且发现在所有情况下都没有使用索引)。
所以,我的问题:我做错了什么?是否有可能在动态更改的密钥上创建索引? 或者我应该考虑改变保存数据的方式? (数据结构)
祝福!
答案 0 :(得分:0)
在原始模式中,每个嵌入对象在文档中创建一个唯一的字段路径,因此我们无法有效地索引这些路径。可以在this presentation中找到这些索引限制的简要说明(以及重构一个特定案例的示例)。
在您的情况下,您可能会受益于类似于this question的分类模式,我今天早些时候回答过。 MongoDB Content Taxonomy Schema为需要与记录关联的任意键/值对的模式提供了一个很好的建议。此外,它描述了创建复合,多键索引(在同一阵列中的两个嵌入字段上)并使用$elemMatch
按键/值对进行查询。这个例子需要一个对象数组,每个对象都有一个键和值字段。
另一种模式可以是一个字符串数组(例如["key1=value1", "key2=value2"]
),Derick Rethans在他的博客文章中使用了Importing OpenStreetMap data into MongoDB。如果您的键和值都是字符串,我建议使用此模式,但上述分类模式可能更适合非字符串值。