請注意,這個問題也被問到谷歌組。對於這種討論見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'})
確保我們在場上的位置索引所以我們可以在加州
0123針對其值執行 快速查詢
> db.hierarchical.ensureIndex({'location':1})
查找所有記錄
查找所有記錄在馬薩諸塞州
> 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" }
注意,在這種模式下,您的數組中值將需要 獨特。例如,如果你在不同的州有'springfield', 那麼你需要做一些額外的工作來區分。
> 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" }
您可以通過使用$所有運營商和指定更多 水平層次的克服這一點。例如:
> 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" }
傳統上,複合鍵可以很容易地做到這一點。但是,這不是我正在查找的查詢風格。 – IamIC 2011-04-10 07:55:40