(抱歉,如果这是一个微不足道的问题。)
我的文档看起来像这样(Python 语法):
{
'_id': SomeObjectId,
'features': [
{'id': 'featureX' , 'value': 6},
{'id': 'featureY', 'value': 45}
]
}
通过这种结构,可以轻松找到功能列表中包含“featureX”的所有文档。但我也有兴趣检索子文档中关联的值。
我想在Python中如果我通过这样的查询获取文档:db.articles.find({'features.id': 'featureX'})
那么我需要迭代数组“features”以找出正确的“值”。
是否有其他类型的查询可以为我提供有趣的值(在这种情况下,我不需要检索完整文档,只需检索带有 {'id': 'featureX', 'value': 6} 的部分,其中不会位于数组中可预测的索引值。
PS:我想我会以不同的方式设计文档,但我仍然有兴趣知道上面的请求是否可行。
这是新的结构:
{
'_id': SomeObjectId,
'features': {
'featureX': { 'someproperty':'aaa', 'value':6 },
'featureY': {'someproperty' :'bbb', 'value':45}
}
}
这个设计有什么问题吗?
就我而言,“featureS”、“featureS”是唯一的,因此将它们用作字典键不是问题。
编辑:
我需要澄清的是,我需要自动更新文档中的“featureX”和“featureY”,并且MongoDB不支持事务 https://jira.mongodb.org/browse/SERVER-2804。
此外,第二种设计虽然不允许检索子文档,但应该可以轻松地在客户端代码中快速获取所需的信息,假设我可以查询具有特定键的子文档。
我认为这个查询应该完成这项工作:
result = db.articles.find_one({ 'features.featureX': {'$exists': True} } )
interesting_value = result['features']['featureX']['value']