2015-12-21 134 views
0

我有两个集合customSchemas和customdata。除了默认_id指数,我已经添加了以下索引MultiTenant的MongoDb索引

db.customData.createIndex({ "orgId": 1, "contentType": 1 }); 
db.customSchemas.createIndex({ "orgId": 1, "contentType": 1 }, { unique: true }); 

我已经决定执行ORGID上的所有通话,所以在我服务层,每个查询中有一个ORGID,即使IDS的那些,例如

db.customData.find({"_id" : ObjectId("557f30402598f1243c14403c"), orgId: 1}); 

我应该添加一个同时具有_id和orgId的索引吗?当我使用_id和orgId进行搜索时,我现在所用的索引是否有帮助?

+0

_id shoud在MongoDB中是唯一的。没有理由在该查询中添加orgId:1 – anhlc

+0

原因是在多租户中强制执行完整性。您绝不希望通过orgId 1进行身份验证的用户能够为orgId 2请求数据。唯一确定的方法是对每个通过身份验证机制硬连接的查询强制执行orgId。保持您的业务是一个非常好的理由。 –

+0

这很有道理 – anhlc

回答

0

MongoDB的2.6+提供index intersection功能,通过使用指数_id{_id:1}指数前缀{ "orgId": 1, "contentType": 1 }

ORGID所以您的查询{"_id" : ObjectId("557f30402598f1243c14403c"), orgId: 1}应该由指数覆盖已经交叉护住情况。

但是,索引交集的性能低于{"_id" : 1, orgId: 1}上的复合索引,因为它附带了一个额外的步骤(两个集合的交集)。因此,如果这是您大部分时间使用的查询,那么在其上创建复合索引是个好主意。

+0

后续问题。指数中的物业的顺序是否重要?是{“_id”:1,“orgId”:1}与{“orgId”:1,“_id”:1}有什么不同? –

+0

在创建用于搜索的复合索引(不用于排序)时,您可以考虑首先将更清晰的值放在扫描过程中,在这种情况下{“_id”:1,“orgId”:1}更有利 – anhlc