2016-06-26 1 views
0

현재 컬렉션에 대한 사용 권한 집합을 관리하고 있습니다. 각 사용 권한 집합은 사용자의 ID를 키로 저장합니다. 어떤 이유로 키는 현재 BSONObjectID의 문자열 버전입니다.Map [key, value]에서 key-name에 MongoDb 인덱스를 만드는 방법은 무엇입니까?

키에 대한 인덱스를 유지하고 싶습니다. 관련 권한 집합 만 조회 할 수 있으며 특정 사용자에 대한 사용 권한이있는 문서도 찾을 수 있습니다.

편집 : 예 추가 :
예 :
{ "_id": { "$의 OID": "XXXXXX"},
"irrelevantData": "문서 1 데이터 ...",
" 권한 ": {
"키 1 ": {"perm1 "사실,"perm2 : 거짓},
"KEY3": { "perm1"사실, "perm2 : 거짓}
}
{"_id " : { "$ oid": "yyyyyy"},
"irrelevantData": "Documen T2 데이터 ... ",
"권한 ": {
"키 1 ": {"perm1 "거짓"perm2 : TRUE},
"키 2": { "perm1"사실, "perm2 : 거짓 }
}
위의 예제에서 권한에 "key2"가있는 문서 만 선택할 수있게하고 싶습니다.

모델은 다음과 같이이다 :
case class relevantCollection( _id: BSONObjectID, irrelevantData: String, permissions: Option[Map[String, Map[String, Boolean]]])

가 어떻게 대신 값의 키에 인덱스를 만들려면 어떻게해야합니까? 이 키가 문자열 대 BSONObjectID와 관련하여 성능 문제가 있습니까?

+0

ReactiveMongo 함께 할 방법을 요구하기 전에, 나는 [MongoDB의 인덱스 문서를 (https://docs.mongodb.com/manual/indexes/) 확인하고 MongoShell을 시도 할 것입니다. – cchantep

+0

@cchantep : [MongoDB index doc] (https://docs.mongodb.com/manual/indexes/)을 확인했지만 키를 인덱싱하는 방법을 찾지 못했습니다. 어쩌면 내가 잘못 읽고 있니? 제안대로 MongoShell에 대한 작업 솔루션을 찾을 수 있다면 행복 할 것입니다. – RastacraZ

+0

MongoDB 설명서에서 방법을 찾지 못하면 클라이언트 라이브러리로는 할 수 없습니다. – cchantep

답변

1

희박 색인을 사용할 수 있습니다. 색인에는 "permissions.key2"가있는 문서 만 있습니다.

db.permissions.createIndex({"permissions.key2" : 1}, {sparse: true }) 

아래의 쿼리를 사용하여 색인 사용 여부를 확인할 수 있습니다.

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

출력 JSON, 그것은 " IXSCAN"갖는지이기는 계획을 확인. 당신이 아래의 쿼리를 실행하면

"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 }]" 
      ] 
     } 
    } 
} 

마찬가지로, 경력 계획 "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

고맙습니다. 이것이 내가 내 자신으로 좁혔던 것이다. 불행히도 나는 하나 이상의 권한을 가진 각 user_id (예를 들어 key *)에 대해 permission-object가 추가 될 때 동적으로 추가되기 때문에 키 이름을 미리 알지 못한다. – RastacraZ

+0

문제가 해결되었습니다. 다른 사람들에게 도움이 될 수있는 대답을 수락 하시겠습니까? – notionquest

+0

정답으로 표시하십시오. 불행히도 내가하고 싶은 일은 가능하지 않습니다. [http://stackoverflow.com/questions/9009987/improve-querying-fields-exist-in-mongodb](http://stackoverflow.com/ 질문/9009987/개선 - 쿼리 - 필드 - 존재 -에서 - mongodb), [http://stackoverflow.com/questions/8176310/can-mongodb-use-an-index-when-checking-for-existence-of- a-field-with-ope/14627290 # 14627290] (http://stackoverflow.com/questions/8176310/can-mongodb-use-an-index-when-checking-for-existence-of-a-field -with-exists-ope/14627290 # 14627290). – RastacraZ

관련 문제