2016-09-18 63 views
-2

从教程那里我知道我可以在流星在这样的请求排序的MongoDB集合:如何对MeteorJS中的MongoDB集合进行永久排序?

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

但我觉得这个解决方案是不是在性能视图最佳。 因为如果我理解它是正确的,那么每当有请求Users时,都会请求原始集合,然后一遍又一遍地重新排序。

因此,一劳永逸地排序整个集合,然后通过Users.find()访问已经排序的集合更好吗?

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

+1

*“对整个集合进行排序”*在MongoDB中没有意义,根据它的文档,它不能保证*检索时的排序顺序。 – jonrsharpe

回答

1

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

“排序”一个MongoDB 集合并没有真正的一致含义。它并没有转化为一套具体的行动。你会怎样分类?是否有一种“自然”的方式来对一组结构可能不同的文件进行排序?

用于使数据检索更有效的机制是索引。如果可能,在服务器上使用索引来辅助排序:

在MongoDB中,排序操作可以通过基于索引中的排序检索文档来获取排序顺序。如果查询计划程序无法从索引获取排序顺序,则会将结果排序在内存中。使用索引的排序操作通常比没有使用索引的排序操作有更好的性能。另外,不使用索引的排序操作在使用32 MB内存时会中止。

(来源:MongoDB documentation

作为一个集合不具有内在为了它,它包含有关MongoDB中的订货要求信息的实体是一个光标。游标可以被多次获取,并且理论上可以被制作成有效的有序数据获取器。

不幸的是,目前情况并非如此。 MiniMongo目前实施的方式没有索引,也不会按订单缓存文档。每次获取光标时都会对它们进行重新排序。

排序是相当有效的(尽管排序可以是有效的,排序函数调用),但是对于大型数据集来说,它可能会相当长并降低用户体验。目前,如果您有一个特殊用例需要重复访问以相同方式排序的大型数据集,那么您可以尝试通过观察游标并在发生更改时更新缓存。

相关问题