提问人:Jean-Samuel Girard 提问时间:11/1/2023 更新时间:11/1/2023 访问量:44
MongoDB - 对可能是也可能不是数组的多个字段进行排序(“不能使用并行数组的键进行排序”)
MongoDB - Sorting on multiple fields that may or may not be Arrays (“cannot sort with keys that are parallel arrays”)
问:
在我的用例中,我对未知类型的字段进行索引和排序时遇到了问题。这意味着它们可能是一个文档中的数组,但另一个文档中的相同字段可能是其他内容。
现在,您可能知道 Mongo 不允许对多个 Array 字段进行索引或排序,如果您尝试,它会给出以下错误:“无法使用并行数组的键进行排序”
作为解释这篇文章的示例,我将使用以下索引: 请记住,字段 a 和字段 b 可以是此示例中的任何类型(对象、数组、数字、字符串、日期等),并且文档之间的类型可以不同。{a:1,b:1}
在这个示例中,如果我尝试插入以下文档,它可以工作:{a:1, b:2}
{a:[1,2,3],b:"hi"}
但是,如果我尝试插入这样的文档:{a:[1,2,3], b:["a","b","c"]}
我收到错误。
我不知道该怎么做才能解决这个问题,而且这种限制毫无意义。MongoDB Jira 上的相关问题
在我的用例中,我绝对需要能够对任意字段进行排序,而且我还没有想出一种有意义且不会对性能产生太大影响的解决方法。
我想出的解决方法:
创建所有字段的副本以进行排序,其中数组被转换为字符串或其他格式(显然这是非常糟糕的,因为它复制了所有数据) 示例:{a:1, a_sort:1, b:[1,2,3], b_sort:“[1,2,3]”} 和索引: {a_sort:1, b_sort:1}
将$sort聚合阶段替换为执行自定义排序的$function聚合,这也是非常糟糕的,因为我们失去了索引和$limit阶段优化的所有好处(限制阶段优化可以通过在过滤器中立即返回 false 来在函数中进行某种程度的模拟,但它不会像 mongo 那样有效)
永远不要存储数组 使用键“entry_0”、“entry_1”、“entry_2”存储对象并在应用程序代码中转换为数组,这也非常糟糕,因为我们无法访问 $push、$pull、$in 和其他在数组上工作的运算符,并且它会给应用程序增加工作。
(请注意,我实际上并不需要将数组排序为数组,只要顺序是合乎逻辑的并且不破坏其他值类型,它们就可以转换为字符串,我只是希望有一个标志或其他东西可以告诉 mongo 按其 JSON 字符串对数组进行排序,这样它就不会破坏其他数据类型)
有什么想法或建议吗?
答: 暂无答案
评论