如何在MongoDB中索引动态属性


8

我在MongoDB中有以下类型的数据(与我的实际情况相比有所简化):

{
    "name":"some name",
    "attrs":[
        {"n":"subject","v":"Some subject"},
        {"n":"description","v":"Some great description"},
        {"n":"comments","v":"Comments are here!"},
        ]
}

attrs数组是动态属性的容器,即我事先不知道将哪种类型的属性放在那里。n代表名称,v代表价值。

《 MongoDB In Action》一书将其描述为在属性完全可上调的情况下具有动态属性的解决方案。它还描述了您可以像这样对它建立索引:

db.mycollection.ensureIndex({"attrs.n":1, "attrs.v":1})

然后可以这样查询:

db.mycollection.find({attrs: {$elemMatch: {n: "subject", v: "Some subject"}}})

当我对此进行测试时,我会得到非常差的性能。我用mycollection测试了200万个文档,但没有索引似乎表现更好。

那么,问题来了,有没有一种方法可以对这种动态属性设置建立索引,从而使索引具有良好的性能?就我而言,仅具有“主题”和“描述”之类的键并对其全部建立索引是不可行的...

Answers:


5

我还在mongodb-user邮件列表上问了同样的问题(以扩展形式),在这里我得到了答案。从那里阅读以获取更多详细信息。简短的答案是,问题中使用的策略应该可以正常工作,但是存在一个问题,它使效率非常低下。希望这个问题能尽快解决。

就我而言,我只需要查询元组{n,v}的完全匹配项,因此可以创建一个多键索引:

db.mycollection.ensureIndex({"attrs":1})

并使他们这样查询:

db.mycollection.find({"attrs": {n: "subject", v: "Some subject"}})

效果很好,并且非常有效地使用了索引。


0

这里问了同样的问题。从4.2版本的MongoDB开始,他们宣布了通配符索引。这是一个例子:

db.myCollection.createIndex( { "subdocument.$**": 1 } );
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.