2016-08-24 5 views
1

Ich habe eine Highscore-mongodb Tabelle, die Dokumente wieMongoDB: Welchen Index soll ich verwenden?

{username:"Bob",score:10,category:"mostLikes"} {username:"John",score:32,category:"mostLikes"} {username:"Bob",score:2,category:"leastDeaths"}

Ziel enthält, ist die Top 100 (sortiert) einer bestimmten Kategorie zu holen.

Wichtig: Bestimmte Highscore-Kategorien sind aufsteigend (niedriger ist besser ex: leastDeaths) und andere sind absteigend (größer ist besser ex: mostLikes). Das bedeutet, dass ich abhängig von der Kategorie entweder die 100 größten oder die 100 niedrigsten Ergebnisse möchte.

Es gibt zwei Haupt-Abfragen in meiner Anwendung:

db.highscore.find({category:category}, {}).limit(100).sort({ score: 1 /*or -1*/ });

db.highscore.find({username:username});

Welche Index würden Sie empfehlen?

Würden aufsteigende Kategorien und absteigende Kategorien in verschiedenen Tabellen zu besseren Ergebnissen führen?

Hinweis: Ich möchte keine Tabelle pro Kategorie haben.

+0

hey @RainingChain können Sie bitte die Antwort akzeptiert markieren, wenn Sie denken, dass dies geholfen und überzeugt. – user641887

Antwort

2

habe ich einigen Test auf meinem lokalen mit einigen Beispieldatensätzen und ich denke, dass die beste Option, um einen Index für „category_1_score_1_username_1“

einen Index für die folgenden Felder zu erstellen wäre Erstellen gibt Ihnen eine Abfrage abgedeckt und damit die Dokumente werden direkt aus dem Index zurückgegeben.

unter meiner Analyse finden

> db.usr.find(); 
{ "_id" : ObjectId("57bd20630744bd376277a795"), "username" : "Bob", "score" : 10, "category" : "mostLikes" } 
{ "_id" : ObjectId("57bd20630744bd376277a796"), "username" : "John", "score" : 32, "category" : "mostLikes" } 
{ "_id" : ObjectId("57bd20630744bd376277a797"), "username" : "Bob1", "score" : 2, "category" : "leastDeaths" } 
{ "_id" : ObjectId("57bd20630744bd376277a798"), "username" : "John2", "score" : 132, "category" : "mostLikes" } 
{ "_id" : ObjectId("57bd20630744bd376277a799"), "username" : "Bob3", "score" : 20, "category" : "leastDeaths" } 
{ "_id" : ObjectId("57bd20630744bd376277a79a"), "username" : "John4", "score" : 132, "category" : "mostLikes" } 
{ "_id" : ObjectId("57bd20630744bd376277a79b"), "username" : "Bob5", "score" : 22, "category" : "leastDeaths" } 
{ "_id" : ObjectId("57bd20630744bd376277a79c"), "username" : "John6", "score" : 322, "category" : "mostLikes" } 
{ "_id" : ObjectId("57bd20630744bd376277a79d"), "username" : "Bob7", "score" : 232, "category" : "leastDeaths" } 
{ "_id" : ObjectId("57bd20630744bd376277a79e"), "username" : "John8", "score" : 3112, "category" : "mostLikes" } 
{ "_id" : ObjectId("57bd20630744bd376277a79f"), "username" : "Bob4", "score" : 222, "category" : "leastDeaths" } 
{ "_id" : ObjectId("57bd20630744bd376277a7a0"), "username" : "John22", "score" :, "category" : "mostLikes" } 
{ "_id" : ObjectId("57bd20630744bd376277a7a1"), "username" : "Bob33", "score" : 2111, "category" : "leastDeaths" } 

Indizes:

> db.usr.getIndexes(); 
     { 
       "v" : 1, 
       "key" : { 
         "category" : 1, 
         "score" : 1, 
         "username" : 1 
       }, 
       "name" : "category_1_score_1_username_1", 
       "ns" : "test.usr" 
     } 
] 
> 

Jetzt können Sie Ihre Anfrage leicht ändern, um es über eine überdachte Abfrage zu machen zurückzukehren.

So wie Sie die Ausgabe sehen können, ist die Anzahl der gescannten Dokumente 0, während die Datensätze direkt aus dem Index abgerufen werden. Die Auswahl dieses Index wäre also die beste Wahl für die erste Abfrage.

Für die zweite Abfrage sollte das einfach sein, einen Index für das Feld Benutzername zu erstellen, und das sollte die zweite Abfrage für Sie lösen.

HTH.

Verwandte Themen