Обратите внимание, что этот вопрос также задавался в группе Google.См. http://groups.google.com/group/mongodb-user/browse_thread/thread/5cd5edd549813148 для этой дискуссии.
Один из вариантов - использовать ключ массива.Вы можете сохранить иерархию в виде массива значений (например, ['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" }