2016-05-31 4 views
0

Ich bin ein wenig verwirrt, was wäre ein guter Index (oder Indizes?) Für die Abfrage, die ich versuche zu verwenden. Diese Abfrage ist nicht eindeutig, aber es ist ziemlich genau das Wesentliche, wie meine Abfragen jetzt aussehen. Ich habe Werte durch Platzhalter ersetzt, sodass sie möglicherweise nicht sehr sinnvoll sind. Es gibt auch die Notwendigkeit, am Ende zu sortieren.mongodb - versuchen, einen zusammengesetzten Index basierend auf der Abfrage zu erstellen

{ 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}}

Ein Beispiel Dokument sieht wie folgt aus:

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

ich das Prinzip der verstehen, wie zusammengesetzte Indizes sollten auf einer kleinen Anzahl von Feldern gebildet werden, und doch scheint es, wie ich verstehe nicht wirklich, wie ich es in meinem Fall erreichen soll.

Jeder Eingang wird natürlich geschätzt.

Antwort

1

Ich würde einen Index so etwas erstellen.

{OID: 1, Status: -1, prov: -1, Login: -1, LocationID: -1, createdAt: -1, Gruppe: -1, tags: -1}

um Soweit ein komplexer Index besteht, ist der einzige Teil, der für einen zusammengesetzten Index wichtig ist, die erste Option. also alles, was OID und jede Kombination und Reihenfolge des Rests des Index verwendet. Will den Index benutzen. Der einzige andere Teil, der sich gegenüber einem einfachen Index ändern würde, ist, dass sich die Sortierreihenfolge bei einem zusammengesetzten Index nicht ändern kann.

viel Glück.

+0

Interessant. Ich habe es ausprobiert, aber es sieht so aus, als würde die Abfrage mit einem einfachen Ein-Feld-Index ({ownerId: 'hashed'} bei ~ 120ms) besser abschneiden als mit Ihrem zusammengesetzten Index (~ 2500ms). – nainy

+0

bedeutete 'oId', nicht' ownerId', sorry – nainy

+1

hmm. Wie viele Dokumente befinden sich in der Sammlung, die Sie abfragen? –

Verwandte Themen