この質問は google グループでも行われたことに注意してください。その議論については、http: //groups.google.com/group/mongodb-user/browse_thread/thread/5cd5edd549813148を参照してください。
1 つのオプションは、配列キーを使用することです。階層を値の配列として格納できます (['US','CA','Los Angeles'] など)。次に、その配列キーの個々の要素に基づいてレコードに対してクエリを実行できます。次に例を示します。まず、階層を表す配列値を使用していくつかのドキュメントを保存します。
> db.hierarchical.save({ location: ['US','CA','LA'], name: 'foo'} )
> db.hierarchical.save({ location: ['US','CA','SF'], name: 'bar'} )
> db.hierarchical.save({ location: ['US','MA','BOS'], name: 'baz'} )
その値に対して高速なクエリを実行できるように、場所フィールドにインデックスがあることを確認してください
> db.hierarchical.ensureIndex({'location':1})
カリフォルニア州のすべてのレコードを検索
> db.hierarchical.find({location: 'CA'})
{ "_id" : ObjectId("4d9f69cbf88aea89d1492c55"), "location" : [ "US", "CA", "LA" ], "name" : "foo" }
{ "_id" : ObjectId("4d9f69dcf88aea89d1492c56"), "location" : [ "US", "CA", "SF" ], "name" : "bar" }
マサチューセッツ州のすべてのレコードを検索
> db.hierarchical.find({location: 'MA'})
{ "_id" : ObjectId("4d9f6a21f88aea89d1492c5a"), "location" : [ "US", "MA", "BOS" ], "name" : "baz" }
米国内のすべてのレコードを検索
> db.hierarchical.find({location: 'US'})
{ "_id" : ObjectId("4d9f69cbf88aea89d1492c55"), "location" : [ "US", "CA", "LA" ], "name" : "foo" }
{ "_id" : ObjectId("4d9f69dcf88aea89d1492c56"), "location" : [ "US", "CA", "SF" ], "name" : "bar" }
{ "_id" : ObjectId("4d9f6a21f88aea89d1492c5a"), "location" : [ "US", "MA", "BOS" ], "name" : "baz" }
このモデルでは、配列内の値は一意である必要があることに注意してください。たとえば、異なる州に「スプリングフィールド」がある場合、区別するために追加の作業を行う必要があります。
> db.hierarchical.save({location:['US','MA','Springfield'], name: 'one' })
> db.hierarchical.save({location:['US','IL','Springfield'], name: 'two' })
> db.hierarchical.find({location: 'Springfield'})
{ "_id" : ObjectId("4d9f6b7cf88aea89d1492c5b"), "location" : [ "US", "MA", "Springfield"], "name" : "one" }
{ "_id" : ObjectId("4d9f6b86f88aea89d1492c5c"), "location" : [ "US", "IL", "Springfield"], "name" : "two" }
$all 演算子を使用し、階層のレベルをさらに指定することで、これを克服できます。例えば:
> db.hierarchical.find({location: { $all : ['US','MA','Springfield']} })
{ "_id" : ObjectId("4d9f6b7cf88aea89d1492c5b"), "location" : [ "US", "MA", "Springfield"], "name" : "one" }
> db.hierarchical.find({location: { $all : ['US','IL','Springfield']} })
{ "_id" : ObjectId("4d9f6b86f88aea89d1492c5c"), "location" : [ "US", "IL", "Springfield"], "name" : "two" }