{ field_1: ["a", "b", "c"], field_2: ["x", "y", "z"] }
我可以创建一个包含FIELD_1和FIELD_2的复合索引吗?如果不是,我还有什么办法来解决这个问题呢?
hrysbysz1#
从实验上看,很容易确认第一个问题的答案是“不”。如this playground example所示,尝试这样做将生成类似以下内容的错误(其行为取决于索引或数据是首先创建的):
cannot index parallel arrays [field_2] [field_1]
此处记录了此限制,取消此限制的请求似乎被跟踪为here。对第二个问题的回答稍微开放一些。如何解决此问题取决于您的环境和目标。最直接的做法是创建只包含这两个字段中更具选择性的字段的索引。如果field_1具有合理的选择性(可能与其他索引的非数组字段一起),那么从性能和效率的Angular 来看,数据库必须对field_2进行的筛选可能是完全可以接受的。如果您“真的”想要这样做,您可以修改模式,将这些“并行数组”更改为嵌套数组,尽管我不一定推荐这样做。这可能类似于以下内容:
field_1
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 }
如果其中一个数组的大小是有界的并且非常小,则这是最可行的。如果这两种方法都不合适,那么您可能需要考虑对您的模式和整体数据模型进行更剧烈的更改。
1条答案
按热度按时间hrysbysz1#
从实验上看,很容易确认第一个问题的答案是“不”。如this playground example所示,尝试这样做将生成类似以下内容的错误(其行为取决于索引或数据是首先创建的):
此处记录了此限制,取消此限制的请求似乎被跟踪为here。
对第二个问题的回答稍微开放一些。如何解决此问题取决于您的环境和目标。
最直接的做法是创建只包含这两个字段中更具选择性的字段的索引。如果
field_1
具有合理的选择性(可能与其他索引的非数组字段一起),那么从性能和效率的Angular 来看,数据库必须对field_2
进行的筛选可能是完全可以接受的。如果您“真的”想要这样做,您可以修改模式,将这些“并行数组”更改为嵌套数组,尽管我不一定推荐这样做。这可能类似于以下内容:
您可以在this playground example中看到,可以使用该架构成功构建以下索引:
如果其中一个数组的大小是有界的并且非常小,则这是最可行的。
如果这两种方法都不合适,那么您可能需要考虑对您的模式和整体数据模型进行更剧烈的更改。