首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB对层次型查询的适用性

MongoDB对层次型查询的适用性
EN

Stack Overflow用户
提问于 2011-04-08 19:13:04
回答 1查看 10.4K关注 0票数 11

我有一个特殊的数据操作需求,我已经解决了如何在Server和PostgreSQL中操作数据。然而,我对速度不太满意,所以我正在调查MongoDB。

描述查询的最佳方法如下所示。想象一下美国的等级数据:国家、州、县、市。假设一个特定的供应商可以为整个加州服务。另一个也许只能为洛杉矶服务。潜在有成千上万的供应商,他们都可以从这个层次结构中的某个点开始服务。我没有混淆这个和Geo -我是用这个来说明需要。

使用递归查询,获得可以为特定用户提供服务的所有供应商的列表非常简单。如果他在加州洛杉矶的帕萨迪纳,我们会走上层次结构,得到适用的ID,然后再向下查询以找到供应商。

我知道这可以优化。同样,这只是一个简单的查询示例。

我知道MongoDB是一个文档商店。这很适合我的其他需要。问题是它是否适合我描述的查询类型?(我知道它没有连接--这些都是模拟的)。

我知道这是一个“一根绳子有多长”的问题。我只想知道是否有人有过MongoDB做这类事情的经验。从0到测试可能需要相当长的时间,如果MongoDB不适合这样做,我希望节省时间。

示例

当地一家电影商店"A“可以供应斯普林菲尔德的蓝光电影。一家在全国范围内分销的连锁店"B“可以为所有IL提供蓝光服务。而且一个按需下载的商店"C“可以提供给整个美国。

如果我们想得到伊利诺伊州斯普林菲尔德所有适用的电影供应商,答案将是A,B,C。

换句话说,在层次结构上有许多不同级别的供应商。

EN

回答 1

Stack Overflow用户

发布于 2011-04-08 20:18:00

请注意,这个问题也是在谷歌小组上提出的。有关这个问题,请参见http://groups.google.com/group/mongodb-user/browse_thread/thread/5cd5edd549813148

一种选择是使用数组键。您可以将层次结构存储为一系列值(例如,“US”、“CA”、“洛杉矶”)。然后可以根据数组键中的单个元素对记录进行查询,例如:首先,使用表示层次结构的数组值存储一些文档。

代码语言:javascript
复制
> 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'} ) 

确保位置字段有索引,以便对其值执行快速查询。

代码语言:javascript
复制
> db.hierarchical.ensureIndex({'location':1}) 

在加利福尼亚找到所有的记录

代码语言:javascript
复制
> db.hierarchical.find({location: 'CA'}) 
{ "_id" : ObjectId("4d9f69cbf88aea89d1492c55"), "location" : [ "US", "CA", "LA" ], "name" : "foo" } 
{ "_id" : ObjectId("4d9f69dcf88aea89d1492c56"), "location" : [ "US", "CA", "SF" ], "name" : "bar" } 

找到马萨诸塞州的所有记录

代码语言:javascript
复制
> db.hierarchical.find({location: 'MA'}) 
{ "_id" : ObjectId("4d9f6a21f88aea89d1492c5a"), "location" : [ "US", "MA", "BOS" ], "name" : "baz" } 

在美国找到所有的记录

代码语言:javascript
复制
> 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”,那么您需要做一些额外的工作来区分。

代码语言:javascript
复制
> 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运算符并指定更多层次结构来克服这一问题。例如:

代码语言:javascript
复制
> 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" } 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5599759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档