gpt4 book ai didi

database-design - 如何在这个嵌套文档结构(MongoDB)中进行查询?

转载 作者:可可西里 更新时间:2023-11-01 09:14:37 26 4
gpt4 key购买 nike

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

我有这样的文档(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:我想我会以不同的方式设计文档,但我仍然想知道上面的请求是否可行。

这是新的结构:

{
'_id': SomeObjectId,
'features': {
'featureX': { 'someproperty':'aaa', 'value':6 },
'featureY': {'someproperty' :'bbb', 'value':45}
}
}

这个设计有什么问题吗?在我的案例中,“featureX”、“featureY”是独一无二的,因此将它们用作字典键不是问题。

编辑:我需要澄清的是,我需要自动更新文档中的“featureX”和“featureY”,以及 MongoDB does not support transactions .此外,第二种设计虽然不允许检索子文档,但应该可以轻松地在客户端代码中快速获取所需信息,假设我可以查询具有特定键的子文档。

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

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

最佳答案

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

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

mongo 中已经有两个与此相关的突出问题 positional ($) operator in fields to return specifierAbility to make use of a subdocument's data whose contents were used to satisfy a query using the $ operator . (如果您确实需要该功能,请登录投票)

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

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

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

只会返回特定的特征

关于database-design - 如何在这个嵌套文档结构(MongoDB)中进行查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7723620/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com