【问题标题】:Hash String to be sortable - big data哈希字符串可排序 - 大数据
【发布时间】:2019-09-13 21:55:54
【问题描述】:

这里的假设问题。我们有一个包含文档的数据库,所有文档都有一个名称。但是,我们的数据库不提供自然排序功能,只有字母可用 asc/desc。我们需要在使用自然排序的同时对数据进行分页。

是否有一种算法可以将字符串转换为自然排序字符串,然后可以用作排序列?有这样的事吗?或者有更好的方法吗?

记录数太多,所以我们无法全部提取并在代码中排序。所以尝试看看是否有一种方法可以在不完全迭代所有内容的情况下使其可排序。

【问题讨论】:

  • 如果您的 DBMS 支持存储过程,您当然可以使用这些。正如我所见,MongoDb 仅支持“存储的 javascript”。请注意,Java 和 Javascript 之间没有任何关系。
  • Christopher 我还没有找到一种通过存储过程实现的有效方法,因为在我的情况下这是一个大数据问题。当它需要对 100k+ 行进行排序时,对每一行运行计算的性能影响是巨大的。
  • 但是如果在 DBMS 中运行,性能还是会更好。对此没有任何争论。在程序中执行此操作将至少将数据通过网络的传输添加到整个过程中。它更有可能忽略诸如索引之类的东西以及适当的 DB(MS) 具有的所有其他简洁的加速。

标签: java c# sql mongodb


【解决方案1】:

假设您可以创建一个名为 filename_sort 的列,该列的文件名中的任何数字都用 0 填充。然后,您可以按该列排序。

  public static void toFilenameSort(String filename) {
    Matcher m = Pattern.compile("(\\d+)").matcher(message);
    StringBuffer sb = new StringBuffer();
    while (m.find()) {
        m.appendReplacement(sb, String.format("%010d", Integer.parseInt(m.group(1))) );
    }
    m.appendTail(sb);
    return sb.toString().toLowerCase();
  }

根据您的文件名,您可能需要也可能不需要使其更复杂。

上面的输出是

Filename-11.txt -> filename-0000000011.txt
Filename-2.txt  -> filename-0000000002.txt

【讨论】:

  • 这绝对是个坏主意,但鉴于存储过程支持不佳,它可能是最好的。只是一个小小的改进:MongoDB 确实支持视图。所以它不需要是一个真正的表,并且可以保存到 DBMS,所有的改进都需要:docs.mongodb.com/manual/core/views 但是对于 Mongo,我怀疑它是否支持缓存这样的视图结果,所以一个额外的列可能确实更快。
猜你喜欢
  • 2011-01-01
  • 1970-01-01
  • 2012-04-15
  • 2021-09-28
  • 2015-06-22
  • 1970-01-01
  • 1970-01-01
  • 2017-05-13
  • 2016-12-26
相关资源
最近更新 更多