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

2023-12-20

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

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

我已经回答过几次关于从 mongo 集合中单独获取子文档的问题here https://stackoverflow.com/questions/7692865/mongodb-querying-array-elements-within-a-document/7702608#7702608, and here https://stackoverflow.com/questions/7554370/how-to-find-the-matched-record-in-mongodb/7555074#7555074

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

mongo 中已经存在两个与此相关的未决问题字段中的位置 ($) 运算符返回说明符 https://jira.mongodb.org/browse/SERVER-828 and 能够利用子文档的数据,其内容用于满足使用 $ 运算符的查询 https://jira.mongodb.org/browse/SERVER-3089。 (如果您确实需要该功能,请登录投票)

而且您的备用模式在这里也没有用。

因此,您必须将每个功能存储在单独的文档中,如下所示,以使其按照您想要的方式工作

特点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})

只会返回特定的功能

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在这种嵌套文档结构(MongoDB)中进行查询? 的相关文章

随机推荐