gpt4 book ai didi

mongodb:为嵌套文档创建顶级索引,而不是必须为每个单独的子级别编制索引?

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

这个问题是关于我如何在 MongoDB 中使用索引来查找嵌套文档中的内容,而不必为每个单独的子级别编制索引。我在 MongoDB 中有一个集合“测试”,基本上是这样的:

{
"_id" : ObjectId("50fdd7d71d41c82875a5b6c1"),
"othercol" : "bladiebla",
"scenario" : {
"1" : { [1,2,3] },
"2" : { [4,5,6] }
}}

场景有多个键,每个文档可以有场景的任何子集(即从无到子集到所有)。另外:场景不能是数组,因为我需要它作为 Python 中的字典。我在“场景”字段上创建了一个索引。
我的问题是我想选择集合,过滤具有特定值(value)的文档。所以这在功能上很好用:

db.test.find({"scenario.1": {$exists: true}})

但是,它不会使用我在场景中放置的任何索引。只有当我在“scenario.1”上放置一个索引时,才会使用一个索引。但我可以有数千(或更多)场景(并且集合本身有 100.000 条记录),所以我不想这样做!
所以我尝试了替代方案:

db.test.find({"scenario": "1"}) 

这将在场景中使用索引,但不会返回结果。将场景设为数组仍然会出现相同的索引问题。

我的问题清楚吗?任何人都可以指导我如何在这里实现最佳性能吗?

附言我看过这个:How to Create a nested index in MongoDB?但这种解决方案在我的情况下是不可能的(由于场景的数量)

最佳答案

放置一个 index on a subobject like scenario 在这种情况下是无用的,因为它只会在您过滤完整的 scenario 对象而不是单个字段时使用(将其视为二进制 blob 比较) .

您要么需要在每个可能的字段(“scenario.1”“scenario.2” 等)上添加索引,要么重新设计您的架构通过做这样的事情来摆脱动态键:

{
"_id" : ObjectId("50fdd7d71d41c82875a5b6c1"),
"othercol" : "bladiebla",
"scenario" : [
{ id: "1", value: [1,2,3] },
{ id: "2", value: [4,5,6] }
}}

然后您可以将单个索引添加到 scenario.id 以支持您需要执行的查询。

我知道你说你需要 scenario 是一个字典而不是一个数组,但我不明白你有多少选择。

关于mongodb:为嵌套文档创建顶级索引,而不是必须为每个单独的子级别编制索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14470486/

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