2016-06-26 3 views
0

Wir verwalten derzeit eine Reihe von Berechtigungen als eine Karte für eine Sammlung. Jeder Berechtigungssatz wird mit der Benutzer-ID als Schlüssel abgelegt. Aus irgendeinem Grund ist dieser Schlüssel derzeit eine stringifizierte Version einer BSONObjectID.Wie erstellt man einen MongoDb-Index für Schlüsselname in Map [Schlüssel, Wert]?

Ich möchte einen Index für die Schlüssel erhalten, so kann ich nur die entsprechende Menge von Berechtigungen Nachschlag, und auch diese Dokumente finden, wo Berechtigungen für bestimmte Benutzer vorhanden ist.

edit: Beispiel hinzugefügt:
Beispiel:
{ "_id": { "$ oid": "xxxxxx"},
"irrelevantData": "Document1 Daten ...",
" Berechtigungen ": {
"key1": { "recht1": true "PERM2: false},
"key3": {" recht1" : true "PERM2: false}
}
{" _id" : {"$ oid": "yyyyyy"},
"irrelevanteDaten": "Documen t2 Daten ... "
"Berechtigungen": {
"key1": {" recht1" : false, "PERM2: true},
"key2": {" recht1" : true „PERM2: false }
}
im obigen Beispiel würde ich meine Dokumente indizieren zu holen sein mag in der Lage nur dann, wenn „key2“ in Berechtigungen vorhanden ist.

Das Modell ist wie folgt:
case class relevantCollection( _id: BSONObjectID, irrelevantData: String, permissions: Option[Map[String, Map[String, Boolean]]])

Wie erstelle ich einen Index auf einem Schlüssel anstelle eines Wertes? Gibt es ein Leistungsproblem in Bezug auf diesen Schlüssel, der ein String vs. ein BSONObjectID ist?

+0

Bevor die Frage, wie es mit ReactiveMongo zu tun, würde ich die [MongoDB Index doc] (https://docs.mongodb.com/manual/indexes/) überprüfen und die MongoShell versuchen. – cchantep

+0

@cchanstep: Ich habe das [MongoDB-Index-Dokument] (https://docs.mongodb.com/manual/indexes/) überprüft, habe aber nichts gefunden, wie man einen Schlüssel indexiert. Vielleicht lese ich es falsch? Wenn ich nur eine funktionierende Lösung für die MongoShell finden konnte, wie Sie vorschlagen, würde ich mich freuen :) – RastacraZ

+0

Also, wenn Sie nicht über eine Art und Weise in der Dokumentation MongoDB finden, gibt es keine Möglichkeit, es mit jeder Client-Bibliothek zu tun. – cchantep

Antwort

1

Sie können Sparse-Index für diese Anforderung verwenden. Der Index enthält nur Dokumente, in denen "permissions.key2" vorhanden ist.

Die folgende Abfrage kann verwendet werden, um zu überprüfen, ob der Index verwendet wird.

db.getCollection('permissions').find({"permissions.key2" : { 
      "perm1" : true, 
      "perm2" : false 
     }}).explain(); 

In der Ausgabe JSON, überprüfen Sie den Gewinnplan, ob es "IXSCAN" hat.

"winningPlan" : { 
    "stage" : "FETCH", 
    "inputStage" : { 
     "stage" : "IXSCAN", 
     "keyPattern" : { 
      "permissions.key2" : 1 
     }, 
     "indexName" : "permissions.key2_1", 
     "isMultiKey" : false, 
     "isUnique" : false, 
     "isSparse" : true, 
     "isPartial" : false, 
     "indexVersion" : 1, 
     "direction" : "forward", 
     "indexBounds" : { 
      "permissions.key2" : [ 
       "[{ perm1: true, perm2: false }, { perm1: true, perm2: false }]" 
      ] 
     } 
    } 
} 

Und falls Sie die unten stehende Abfrage der Sieger Plan laufen würde zeigen, "COLLSCAN".

db.getCollection('permissions').find({"permissions.key1" : { 
      "perm1" : false, 
      "perm2" : true 
     }}).explain() 

"winningPlan" : { 
      "stage" : "COLLSCAN", 
      "filter" : { 
       "permissions.key1" : { 
        "$eq" : { 
         "perm1" : false, 
         "perm2" : true 
        } 
       } 
      }, 
      "direction" : "forward" 
     } 
+0

Danke. Das habe ich auf mich selbst beschränkt. Leider kenne ich die Schlüsselnamen nicht im Voraus, da sie dynamisch hinzugefügt werden, wenn ein Berechtigungsobjekt für jede Benutzer-ID (Schlüssel * im Beispiel) mit einer oder mehreren Berechtigungen hinzugefügt wird. – RastacraZ

+0

Froh, dass das Problem gelöst ist. Würde es Ihnen etwas ausmachen, die Antwort für andere zu akzeptieren? – notionquest

+0

Markieren Sie dies als die richtige Antwort, weil es ist. Leider, was ich tun möchte, scheint nicht möglich zu sein: [http://stackoverflow.com/questions/9009987/improve-querying-fields-exist-in-mongodb](http://stackoverflow.com/ Fragen/9009987/verbessern-abfragen-Felder-exist-in-mongodb), [http://stackoverflow.com/questions/8176310/can-mongodb-use-an-index-when-checking-for-existence-of- a-Feld-mit-existiert-ope/14627290 # 14627290] (http://stackoverflow.com/questions/8176310/can-mongodb-use-an-index-when-checking-for-existence-of-a-field -mit-existiert-ope/14627290 # 14627290). – RastacraZ

Verwandte Themen