如何永久地对MeteorJS中的MongoDB集合进行排序?

时间:2016-09-18 21:05:47

标签: mongodb sorting meteor

从教程中我知道我可以根据请求在meteor中对MongoDB集合进行排序:

// Sorted by createdAt descending
Users.find({}, {sort: {createdAt: -1}})

但我觉得这种解决方案在性能方面并不是最优的。 因为如果我理解正确,每次请求Users时,都会请求原始集合,然后一遍又一遍地进行排序。

所以最好一劳永逸地对整个集合进行排序,然后使用Users.find()访问已排序的集合?

问题是:如何永久地对整个集合进行排序,而不仅仅是找到的结果?

1 个答案:

答案 0 :(得分:1)

这是MiniMongo的known limitation,Meteor是MongoDB功能(的一部分)的客户端实现。

“排序”MongoDB 集合并不具有连贯的含义。它不会转化为一组具体的操作。你会把它分类的?是否有一种“自然”方式对一组结构可能不同的文档进行排序?

用于提高数据检索效率的机制是索引。在服务器上,索引用于协助排序,如果可能:

  

在MongoDB中,排序操作可以通过根据索引中的排序检索文档来获取排序顺序。如果查询计划程序无法从索引获取排序顺序,它将在内存中对结果进行排序。使用索引的排序操作通常比不使用索引的排序操作具有更好的性能。此外,不使用索引的排序操作将在使用32兆字节的内存时中止。

     

(资料来源:MongoDB documentation

由于集合没有固有的顺序,因此在MongoDB中保存有关订单要求的信息的实体是Cursor。可以多次提取游标,理论上可以将其转换为有效的有序数据提取器。

不幸的是,目前情况并非如此。它目前的实现方式,MiniMongo没有索引,也没有按顺序缓存文档。每次提取光标时都会重新排序。

排序相当有效(排序可以有效,O(n*logn)排序函数调用),但对于大型数据集,它可能相当冗长并降低用户体验。

目前,如果您有一个需要重复访问以相同方式排序的大型数据集的特殊用例,您可以尝试通过观察游标来保留已排序文档的缓存(如果需要)并在有变化时更新缓存。