Mongo索引对象数组与对象

Ghj*_*nut 29 mongodb mongodb-indexes

我正在实现一个处理很多字段的联系人数据库.它们中的大多数是预定义的,可以被认为是绑定的,但有一些不是.我们会称其中一个字段为"群组".我们目前实现它的方式是(每个文档/联系人都有'groups'字段):

'groups' : {
   152 : 'hi',
   111 : 'group2'
}
Run Code Online (Sandbox Code Playgroud)

但经过一些阅读后,我觉得我应该这样做:

'groups' : [
   { 'id' : 152, 'name' : 'hi' },
   { 'id' : 111, 'name' : 'group2' }
   ...
]
Run Code Online (Sandbox Code Playgroud)

然后应用索引 db.contact.ensureIndex({'groups.id':1});

我的问题是关于功能.两个结构之间有什么区别?如何实际构建索引(它只是在每个文档/联系人中编制索引,还是构建一个包含所有文档/联系人的所有组的完整索引?).

我有点假设这是结构上最好的方式,但如果我不对,请告诉我.

Mar*_*arc 49

在第二种情况下查询肯定会容易得多,其中"组"是一组子文档,每个子文档都带有"id"和"name".

Mongo不支持"通配符"查询,因此如果您的文档是第一种方式构建的,并且您想要找到值为"hi"的子文档,但不知道该键是152,那么您将无法做到这一点.使用第二个文档结构,您可以轻松查询{"groups.name":"hi"}.

有关查询嵌入对象的更多信息,请参阅标题为"点符号(到达对象)"的文档 http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29 "值在"高级查询"文档中的数组"和"嵌入对象中的值"部分也很有用:http: //www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ValueinanArray

对于{'groups.id':1}的索引,将为每个文档中每个"groups"数组中的每个"id"键创建一个索引条目.对于"组"的索引,每个文档只会创建一个索引条目.

如果您有第二种类型的文档和组的索引,则您的查询必须匹配整个子文档才能使用索引.例如,给定文件:

{ "_id" : 1, "groups" : [ { "id" : 152, "name" : "hi" }, { "id" : 111, "name" : "group2" } ] }
Run Code Online (Sandbox Code Playgroud)

查询

db.<collectionName>.find({groups:{ "id" : 152, "name" : "hi" }}) 
Run Code Online (Sandbox Code Playgroud)

将使用索引,但查询

db.<collectionName>.find({"groups":{$elemMatch:{name:"hi"}}})
Run Code Online (Sandbox Code Playgroud)

要么

db.<collectionName>.find({"groups.name":"hi"})
Run Code Online (Sandbox Code Playgroud)

将不会.

您创建的索引应取决于您最常执行的查询.

您可以使用.explain()命令试验查询所使用的索引(如果有). http://www.mongodb.org/display/DOCS/Explain 第一行,"光标"会告诉你正在使用的索引."cursor":"BasicCursor"表示正在执行完整的集合扫描.

有关索引的更多信息,请参阅文档:http: //www.mongodb.org/display/DOCS/Indexes

上面的"索引数组元素"部分链接到标题为"Multikeys"的文档:http: //www.mongodb.org/display/DOCS/Multikeys

希望这将提高您对如何查询嵌入式文档以及如何使用索引的理解.如果您有任何后续问题,请告诉我们!

  • @portforwardpodcast 第一个链接似乎是 https://docs.mongodb.com/manual/core/document/#dot-notation (2认同)