数组字段上的MongoDB复合索引

x6yk4ghg  于 2022-10-22  发布在  Go
关注(0)|答案(1)|浏览(248)
{
  field_1: ["a", "b", "c"],
  field_2: ["x", "y", "z"]
}

我可以创建一个包含FIELD_1和FIELD_2的复合索引吗?如果不是,我还有什么办法来解决这个问题呢?

hrysbysz

hrysbysz1#

从实验上看,很容易确认第一个问题的答案是“不”。如this playground example所示,尝试这样做将生成类似以下内容的错误(其行为取决于索引或数据是首先创建的):

cannot index parallel arrays [field_2] [field_1]

此处记录了此限制,取消此限制的请求似乎被跟踪为here
对第二个问题的回答稍微开放一些。如何解决此问题取决于您的环境和目标。
最直接的做法是创建只包含这两个字段中更具选择性的字段的索引。如果field_1具有合理的选择性(可能与其他索引的非数组字段一起),那么从性能和效率的Angular 来看,数据库必须对field_2进行的筛选可能是完全可以接受的。
如果您“真的”想要这样做,您可以修改模式,将这些“并行数组”更改为嵌套数组,尽管我不一定推荐这样做。这可能类似于以下内容:

{
  arr: [
    { field_1: "a", field_2: ["x", "y", "z"] },
    { field_1: "b", field_2: ["x", "y", "z"] },
    { field_1: "c", field_2: ["x", "y", "z"] }
  ]
}

您可以在this playground example中看到,可以使用该架构成功构建以下索引:

{ "arr.field_1": 1, "arr.field_2": 1 }

如果其中一个数组的大小是有界的并且非常小,则这是最可行的。
如果这两种方法都不合适,那么您可能需要考虑对您的模式和整体数据模型进行更剧烈的更改。

相关问题