索引一个embedded式文档的关键是什么意思?

我仍然不明白如何索引一个embedded式文档的关键真正的作品。
假设我有以下博客文章的集合:

{ _id:0, author: 'John Doe', content: 'How indexing an embedded document work?', comments: [ { sender:'Jane Doe', content: 'I can\'t make it out either.' }, etc... ] }, etc... 

假设我现在在注释中的sender属性中设置一个索引:

 db.blog.createIndex({'comments.sender':1}) 

现在的问题是:
这是否意味着发送者按升序排列的所有元素都创build了一个大的索引,而不pipe他们在哪个数组中? 或者为每个数组创build一个索引?
为了更清楚:当我这样做

 blog.find({'comments.sender':'Jane Doe'}).toArray(function(err, array){}) 

是否会遍历每个博客post,并查找每个数组,直到在该数组中find一条logging,并转到下一个post中的下一个数组? 还是有一个很大的索引,其中每个logging(由发件人sorting)映射到这个匹配所在的原始数组?

这创build了一个索引,每条评论只有一个条目。 如果您有两篇博客文章,每篇文章有三条评论,则您将有一个包含6条logging的索引,由评论发件人名称索引。 你的第二个假设是正确的:你的search将使用这个索引有效地find正确的发送者的所有评论,然后返回相应的博客文章。

所以简短的回答:是的,这样做,它的工作原理,你会得到最佳的查询时间。

您可以使用解释轻松地检查您的查询复杂性:

 > db.blog.insert({'comments': [{'sender': 'Jane'}]}) WriteResult({ "nInserted" : 1 }) > db.blog.insert({'comments': [{'sender': 'Jane'}, {'sender': 'Joe'}]}) WriteResult({ "nInserted" : 1 }) > db.blog.insert({'comments': [{'sender': 'Joe'}]}) WriteResult({ "nInserted" : 1 }) > db.blog.ensureIndex({'comments.sender': 1}) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 } > db.blog.find({'comments.sender': 'Jane'}).count() 2 > db.blog.find({'comments.sender': 'Jane'}).explain() { "cursor" : "BtreeCursor comments.sender_1", "isMultiKey" : true, "n" : 2, "nscannedObjects" : 2, "nscanned" : 2, "nscannedObjectsAllPlans" : 2, "nscannedAllPlans" : 2, "scanAndOrder" : false, "indexOnly" : false, "nYields" : 0, "nChunkSkips" : 0, "millis" : 0, "indexBounds" : { "comments.sender" : [ [ "Jane", "Jane" ] ] }, "server" : "metrics.9.0.api.production.infinit.io:27017", "filterSet" : false } 

在这里,我们看到索引确实被使用(“BtreeCursor”),只有2个对象被扫描,而不是全部。3.删除索引,你将得到一个表扫描:

 > db.blog.dropIndex({'comments.sender': 1}) { "nIndexesWas" : 2, "ok" : 1 } > db.blog.find({'comments.sender': 'Jane'}).explain() { "cursor" : "BasicCursor", "isMultiKey" : false, "n" : 2, "nscannedObjects" : 3, "nscanned" : 3, "nscannedObjectsAllPlans" : 3, "nscannedAllPlans" : 3, "scanAndOrder" : false, "indexOnly" : false, "nYields" : 0, "nChunkSkips" : 0, "millis" : 0, "server" : "metrics.9.0.api.production.infinit.io:27017", "filterSet" : false }