如何在这个嵌套文档结构(MongoDB)中进行查询?

时间:2011-10-11 09:01:22

标签: database-design mongodb querying

(对不起,如果这是一个微不足道的问题。)

我的文档看起来像这样(Python语法):

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

使用此结构,可以轻松找到功能列表中包含“featureX”的所有文档。但我也有兴趣检索子文档中的相关值。 我认为在Python中如果我用这样的查询得到文档:db.articles.find({'features.id': 'featureX'})那么我需要迭代数组'features'来找出正确的'value'。

是否有其他类型的查询可以给我有趣的价值(在这种情况下,我不需要检索完整的文档,只有{'id':'featureX','value'的部分:6 },它不会在数组中的可预测索引值。

PS:我想我会以不同的方式设计文档,但我仍然有兴趣知道上面的resquest是否可行。

这是新结构:

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

这个设计有什么问题吗? 在我的'featureX'中,'featureY'是唯一的,因此使用它们作为字典键不是问题。

编辑: 我需要澄清一下,我需要原子地更新文档中的'featureX'和'featureY'以及MongoDB does not support transactions。 第二种设计虽然不允许检索子文档,但应该可以很容易地快速获取客户端代码中的所需信息,假设我可以查询具有特定密钥的子文档。

我认为这个查询应该可以完成这项工作:

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

1 个答案:

答案 0 :(得分:2)

我已经回答了几次关于从mongo collection herehere

单独获取子文档的问题

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

mongo中有两个与此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相关的未解决问题。 (如果你真的需要这个功能,请登录投票)

您的备用架构在这里也没用。

因此您必须将每个功能存储在单独的文档中,以使其按您希望的方式工作

功能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})

只会返回特定功能