2016-05-31 53 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

嗯。您正在查詢的集合中有多少個文檔? –