Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 如何在此嵌套文档结构(MongoDB)中进行查询?_Database Design_Mongodb_Querying - Fatal编程技术网

Database design 如何在此嵌套文档结构(MongoDB)中进行查询?

Database design 如何在此嵌套文档结构(MongoDB)中进行查询?,database-design,mongodb,querying,Database Design,Mongodb,Querying,(如果这是一个无关紧要的问题,很抱歉。) 我有这样的文档(Python语法): 使用这种结构,可以很容易地在功能列表中找到包含“featureX”的所有文档。但我也对检索子文档中关联的值感兴趣。 我认为在Python中,如果我使用如下查询获取文档:db.articles.find({'features.id':'featureX'})那么我需要迭代数组'features'以找到正确的'value' 是否有其他类型的查询可以为我提供感兴趣的值(在本例中,我不需要检索完整文档,只需检索具有{'id'

(如果这是一个无关紧要的问题,很抱歉。)

我有这样的文档(Python语法):

使用这种结构,可以很容易地在功能列表中找到包含“featureX”的所有文档。但我也对检索子文档中关联的值感兴趣。 我认为在Python中,如果我使用如下查询获取文档:
db.articles.find({'features.id':'featureX'})
那么我需要迭代数组'features'以找到正确的'value'

是否有其他类型的查询可以为我提供感兴趣的值(在本例中,我不需要检索完整文档,只需检索具有{'id':'featureX','value':6}的部分,该部分在数组中不具有可预测的索引值

PS:我想我会以不同的方式设计文档,但我仍然有兴趣知道上面的请求是否可行

以下是新结构:

{
'_id': SomeObjectId,
'features': { 
              'featureX': { 'someproperty':'aaa', 'value':6 }, 
              'featureY': {'someproperty' :'bbb', 'value':45} 
            }
}
这个设计有什么问题吗? 在我的例子中,“featureX”、“featureY”是唯一的,所以使用它们作为发音键不是问题

编辑: 我需要澄清的是,我需要在一份文档中进行原子更新,比如说“featureX”和“featureY”,然后进行修改。 另外,第二种设计虽然不允许检索子文档,但可以很容易地在客户机代码中快速获取所需的信息,前提是我可以查询具有特定键的子文档

我认为这个查询应该可以完成以下工作:

result = db.articles.find_one({ 'features.featureX': {'$exists': True} } )
interesting_value = result['features']['featureX']['value']

关于从mongo collection中单独获取子文档,我已经回答了几次,并且

这是过滤多级嵌入文档的行为,通常匹配的过滤器会返回整个文档,而不是子集

mongo中已经有两个与此和相关的未决问题。(如果确实需要此功能,请登录投票)

您的备用模式在这里也没有用处

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

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

将只返回特定的功能

谢谢。我认为我的备用模式能够在不扫描客户端代码中的所有子文档的情况下快速检索所需的值。我认为我无法将功能放在单独的文档中,因为我需要功能的原子更新,并且mongodb不支持事务。是的,这更容易安宁子文档在客户端,因为你有一个字典式的结构。
db.features.find({'_id':someobjectid})