2012-10-17 37 views
0

我有一个数组中嵌入文档的文档。 prupose是允许别名登录,即:一个用户需要能够拥有多个登录名(username + company_id + pwd),因为他或她可能属于不同的公司。MongoDB在嵌入式数组上使用索引吗?

它看起来somethine这样的:

{ 
    name : "James D" 
    logins : [ 
     {company_id : 1, username : "james", pwd : "****"}, 
     {company_id : 2, username : "james.d", pwd : "****"}, 
     {company_id : 3, username : "jd", pwd : "****"} 
    ] 
} 

我想指数company_idusername,我没有使用

> db.user.ensureIndex({"logins.username" : "james", "logins.company_id" : 1}) 

这里是我的问题,做索引工作?该查询是否使用索引进行了非常实用的操作?我问的是因为(1)我不确定MongoDB是否处理这种索引,以及(2)我不知道如何解释explain()函数。

> db.user.find({"logins.username" : "james", "logins.company_id" : 1}).explain() 
{ 
     "cursor" : "BtreeCursor username.color_1_logins.company_id_1", 
     "nscanned" : 3, 
     "nscannedObjects" : 3, 
     "n" : 2, 
     "millis" : 1, 
     "nYields" : 0, 
     "nChunkSkips" : 0, 
     "isMultiKey" : true, 
     "indexOnly" : false, 
     "indexBounds" : { 
       "logins.username" : [ 
         [ 
           "blue", 
           "blue" 
         ] 
       ], 
       "logins.company_id" : [ 
         [ 
           { 
             "$minElement" : 1 
           }, 
           { 
             "$maxElement" : 1 
           } 
         ] 
       ] 
     } 
} 

回答

1

这些索引是允许的,你的似乎是工作。每个数组元素都被单独添加到索引中,因此在大型数组上索引可能会快速增加索引的大小。对于一些不应该成为问题的用户名的别名。

+0

感谢您的解释 - 这正是我一直在寻找的! – luttkens