2016-05-31 52 views
0

对于我尝试使用的查询,什么是好的索引(或索引?),我有点困惑。这个查询不是唯一的,但它几乎是我的查询现在的样子。我用占位符替换了值,所以它们可能没有多大意义。最后还需要进行分类。mongodb - 试图构建基于查询的复合索引

{ oId: 1, 
 
    status: { '$in': [ 'STATUS1', 'STATUS2' ] }, 
 
    '$and': 
 
    [ { '$or': 
 
     [ { '$or': 
 
      [ { prov: 'P1', 
 
       '$or': [ { tags: { '$in': [ 'tag1' ] } } ] }, 
 
       { prov: 'P2', 
 
       '$or': [ { tags: { '$in': [ 'tag1' ] } } ] }, 
 
       { prov: 'P3', 
 
       '$or': [ { tags: { '$in': [ 'tag1' ] } } ] }, 
 
       { prov: 'P4', 
 
       '$or': [ { tags: { '$in': [ 'tag1' ] } } ] } ] }, 
 
      { '$or': 
 
      [ { prov: 'P1', 
 
       login: { '$in': [ 'login1' ] } }, 
 
       { prov: 'P2', 
 
       login: { '$in': [ 'login2' ] } }, 
 
       { prov: 'P3', 
 
       login: { '$in': [ 'login1' ] } }, 
 
       { prov: 'P3', 
 
       login: { '$in': [ 'login3' ] } } ] }, 
 
      { '$or': 
 
      [ { prov: 'P3', 
 
       group: { '$in': [ 'group1' ] } } ] }, 
 
      { '$or': 
 
      [ { prov: 'P2', 
 
       locationId: { '$in': [ '1', '2' ] } } ] } ] }, 
 
    { '$or': 
 
     [ { prov: 'P1', 
 
      '$or': 
 
      [ { group: 'group2' }, 
 
       { login: 'login5' } ] }, 
 
      { prov: 'P2', 
 
      '$or': 
 
      [ { group: 'group3' }, 
 
       { login: 'login3' } ] }, 
 
      { prov: 'P3', 
 
      '$or': [ { login: 'login3' } ] }, 
 
      { prov: 'P4', 
 
      '$or': [ { login: 'login3' } ] } ] } ] }, {sort: {createdAt: -1}}

一个例子文件看起来是这样的:

{ 
    oId: 1, 
    login: 'login1', 
    locationId: 2, 
    prov: 'P1', 
    status: 'STATUS1', 
    group: 'group1', 
    createdAt: <DateTime>, 
    tags: ['tag1', 'tag2'] 
} 

我明白如何复合索引应该在少数领域的形成原理,但它似乎像我真的不明白我是如何在我自己的情况下完成它的。

当然,任何输入都是赞赏的。

回答

1

我会创建一个像这样的索引。

{OID:1,状态:-1省:-1,登录:-1,locationId:-1,createdAt:-1,组:-1,标签:-1}

以便就复杂指数而言,复合指数唯一重要的部分是第一选择。所以任何使用oId的东西以及索引其余部分的任何组合和顺序。将使用索引。唯一可以改变一个简单索引的其他部分是排序顺序不能随复合索引而改变。

祝你好运。

+0

有趣。我已经尝试了这一点,但似乎查询在一个简单的单一字段索引({ownerId:'hashed'}在〜120ms)上表现更好,而不是你的复合索引(〜2500ms)。 – nainy

+0

意味着'oId',而不是'ownerId',对不起 – nainy

+1

嗯。您正在查询的集合中有多少个文档? –