(对不起,如果这是一个微不足道的问题。)
我的文档看起来像这样(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}
}
}
这个设计有什么问题吗?在我的情况下,'featureX'、'featureY' 是独一无二的,因此将它们用作字典键不是问题。
编辑:我需要澄清一下,我需要在文档中自动更新说 'featureX' 和 'featureY' 并且MongoDB 不支持 transactions。第二种设计虽然不允许检索子文档,但应该可以很容易地在客户端代码中快速获取所需的信息,假设我可以查询具有特定键的子文档。
我认为这个查询应该可以完成这项工作:
result = db.articles.find_one({ 'features.featureX': {'$exists': True} } )
interesting_value = result['features']['featureX']['value']