2011-10-11 100 views
4

(很抱歉,如果这是一个简单的问题。)如何在此嵌套文档结构(MongoDB)中进行查询?

我有一个看起来像这样(Python语法)文件:

{ 
    '_id': SomeObjectId, 
    'features': [ 
       {'id': 'featureX' , 'value': 6}, 
       {'id': 'featureY', 'value': 45} 
       ] 
} 

采用这种结构可以很容易地找到包含“featureX”中的所有文件功能列表。但我也有兴趣检索子文档中的相关值。 我想在Python中,如果我得到这样的查询文档:db.articles.find({'features.id': 'featureX'})然后我需要遍历数组的'功能'找出正确的'价值'。有没有其他类型的查询可以给我有趣的价值(在这种情况下,我不需要检索完整的文档,只有部分{'id':'featureX','value'): 6},该不会是在阵列中的可预测指标值

PS:我想我会设计不同的文件,但我仍然有兴趣知道,如果上述resquest是可行的

这里是新的结构:

{ 
'_id': SomeObjectId, 
'features': { 
       'featureX': { 'someproperty':'aaa', 'value':6 }, 
       'featureY': {'someproperty' :'bbb', 'value':45} 
      } 
} 

是否有关于这个d任何问题esgin? 在我的例子'featureX'中,'featureY'是唯一的,因此使用它作为字典键不是问题。

编辑: 我需要澄清的是,我将需要在文档中原子地更新'featureX'和'featureY',并且需要更新MongoDB does not support transactions。 另外,第二种设计虽然不允许检索子文档,但应该能够很容易地在客户端代码中快速获得所需的信息,假设我可以查询具有特定键的子文档。

我认为这个查询应该做的工作:

result = db.articles.find_one({ 'features.featureX': {'$exists': True} }) 
interesting_value = result['features']['featureX']['value'] 

回答

2

我已经回答了这对夫妻的有关从蒙戈集合here独自拿起子文档倍,here

只要有目前没有办法做到这一点。这是过滤多级嵌入式文档的行为,通常匹配过滤器将返回整个文档,而不是子集。

与此positional ($) operator in fields to return specifierAbility to make use of a subdocument's data whose contents were used to satisfy a query using the $ operator有关的mongo中有两个未解决的问题。 (如果你真的需要该功能,请登录投票)

而你的替代模式在这里也没有用。

所以你必须在每个功能存储在单独的文件中这样使它工作你想

功能1

{ 
'_id': SomeObjectId, 
'name' :'some name', 
'value': 'feature 1', 
'some_field' : 'zzz' 
} 

功能2

{ 
'_id': SomeObjectId, 
'name' :'some name', 
'value': 'feature 2', 
'some_field' : 'zzz' 
} 

和查询

方式
db.features.find({'_id':someobjectid}) 

只会返回具体功能

+0

谢谢。我认为我的备用模式能够快速检索所需的值,而无需扫描客户端代码中的所有子文档。我想我不能将功能放在单独的文档中,因为我需要功能的原子更新,并且mongodb不支持事务。 – ixi

+1

是的,这是真的,它更容易扫描客户端的子文档,因为你有一个字典类结构。 – RameshVel