(对不起,如果这是一个微不足道的问题 . )
我有类似这样的文档(Python语法):
{
'_id': SomeObjectId,
'features': [
{'id': 'featureX' , 'value': 6},
{'id': 'featureY', 'value': 45}
]
}
通过这种结构,它也对检索子文档中关联的值感兴趣 . 我想在Python中如果我得到这样的查询文件: db.articles.find({'features.id': 'featureX'})
那么我需要迭代数组'features'以找出正确的'value' .
是否有其他类型的查询可以给我有趣的 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 回答
我已经回答了几次关于从mongo collection here和here单独获取子文档的问题 .
目前根本无法做到这一点 . 这是过滤多级嵌入文档的行为,通常匹配过滤器将返回整个文档,而不是子集 .
mongo中有两个与此positional ($) operator in fields to return specifier和Ability to make use of a subdocument's data whose contents were used to satisfy a query using the $ operator相关的未决问题 . (如果你真的需要这个功能,请登录投票)
而您的备用架构在这里也没用 .
因此,您必须将每个功能存储在这样的单独文档中,以使其按您希望的方式工作
特色1
特色2
和查询
只会返回特定功能