2016-06-26 14 views
0

現在、コレクションのアクセス権セットをマップとして管理しています。 権限の各セットは、ユーザーのIDをキーとして保管されます。何らかの理由で、キーは現在、BSONObjectIDの文字列化されたバージョンです。Map [key、value]のkey-nameにMongoDbインデックスを作成するには?

私はキーのインデックスを維持したいので、関連する権限のセットだけを検索し、特定のユーザーの権限が存在するドキュメントを見つけることができます。

編集:例では、追加:
例:
{ "_id":{ "$のOID": "XXXXXX"}、
"irrelevantData": "文書1のデータ..."、
"権限 ":{
"KEY1":{ "perm1":真、 "perm2:偽}、
"KEY3":{" perm1" :真、 "perm2:偽}
}
{" _id" :{"$ oid": "yyyyyy"}、
"irrelevantData": "Documen t2データ... "
" "key1":{"perm1":false、 "perm2:true}、
" key2 ":{" perm1 ":true、" perm2 "false }
}
上記の例では、インデックスに "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 }) 

以下のクエリを使用して、インデックスが使用されているかどうかを確認できます。出力JSONで

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

、それは "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

ありがとうございます。これは私が自分でそれを絞り込んだものです。残念ながら、私は事前にキー名を知っていません.1つ以上のパーミッションを持つuser_id(例ではキー*)ごとにパーミッションオブジェクトが追加されたときに動的に追加されるためです。 – 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-present-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

関連する問題