4

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

我的文档看起来像这样(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']
4

1 回答 1

2

我已经回答过这几次关于从 mongo 集合中单独获取子文档的问题,这里这里

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

在 mongo 中已经有两个未解决的问题与返回说明符的字段中的位置 ($) 运算符利用子文档数据的能力相关,这些数据的内容用于满足使用 $ 运算符的查询。(如果您确实需要该功能,请登录投票)

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

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

特色一

{
'_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})

只会返回特定的功能

于 2011-10-11T09:49:06.437 回答