我有一个特殊的数据操作需求,我已经解决了如何在Server和PostgreSQL中操作数据。然而,我对速度不太满意,所以我正在调查MongoDB。
描述查询的最佳方法如下所示。想象一下美国的等级数据:国家、州、县、市。假设一个特定的供应商可以为整个加州服务。另一个也许只能为洛杉矶服务。潜在有成千上万的供应商,他们都可以从这个层次结构中的某个点开始服务。我没有混淆这个和Geo -我是用这个来说明需要。
使用递归查询,获得可以为特定用户提供服务的所有供应商的列表非常简单。如果他在加州洛杉矶的帕萨迪纳,我们会走上层次结构,得到适用的ID,然后再向下查询以找到供应商。
我知道这可以优化。同样,这只是一个简单的查询示例。
我知道MongoDB是一个文档商店。这很适合我的其他需要。问题是它是否适合我描述的查询类型?(我知道它没有连接--这些都是模拟的)。
我知道这是一个“一根绳子有多长”的问题。我只想知道是否有人有过MongoDB做这类事情的经验。从0到测试可能需要相当长的时间,如果MongoDB不适合这样做,我希望节省时间。
示例
当地一家电影商店"A“可以供应斯普林菲尔德的蓝光电影。一家在全国范围内分销的连锁店"B“可以为所有IL提供蓝光服务。而且一个按需下载的商店"C“可以提供给整个美国。
如果我们想得到伊利诺伊州斯普林菲尔德所有适用的电影供应商,答案将是A,B,C。
换句话说,在层次结构上有许多不同级别的供应商。
发布于 2011-04-08 20:18:00
请注意,这个问题也是在谷歌小组上提出的。有关这个问题,请参见http://groups.google.com/group/mongodb-user/browse_thread/thread/5cd5edd549813148。
一种选择是使用数组键。您可以将层次结构存储为一系列值(例如,“US”、“CA”、“洛杉矶”)。然后可以根据数组键中的单个元素对记录进行查询,例如:首先,使用表示层次结构的数组值存储一些文档。
> 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" } 注意,在这个模型中,数组中的值必须是唯一的。例如,如果您在不同的州有“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" } 您可以通过使用$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" } https://stackoverflow.com/questions/5599759
复制相似问题