在MongoDB中永久排序集合
Posted
技术标签:
【中文标题】在MongoDB中永久排序集合【英文标题】:Sort collection permanently in Mongodb 【发布时间】:2013-11-12 21:18:05 【问题描述】:每当我们执行 db.Collection.find().sort() 时,只有我们的输出被排序,而不是集合本身,
即如果我执行 db.collection.find() 那么我会看到原始集合,而不是排序的集合。
有什么方法可以对集合本身进行排序而不是对输出进行排序?
将排序结果导出到整个新集合中也可以。
如果我有编号 _id 字段。(如 _id:1 、 _id_2 、 _id:3 等)
【问题讨论】:
您可以使用 orderby 对您的收藏进行排序 您是否有特殊原因要这样做?存储的文档没有固有的“顺序”。如果您想经常对特定字段进行排序,请为其创建索引。 @rubyist 与执行 sort() 相同。他要问的是,是否有办法对存储在集合中的订单文档进行永久排序,但事实并非如此。 @TomSwifty 实际上我是 mongodb 的新手,我只是想知道我是否可以这样做,没有特别的原因。另外,你能告诉我更多关于索引的信息吗 简而言之,索引将使查询和排序速度提高几个数量级(只要您正确构建它们) 【参考方案1】:我也看不出这样做的任何理由(在您要排序的字段上的索引将帮助您快速进行排序),这是您的问题的解决方案:
这样你就有了你的测试集合
"_id" : ObjectId("5273f6987c6c502364ddfe94"), "n" : 5
"_id" : ObjectId("5273f6e57c6c502364ddfe95"), "n" : 14
"_id" : ObjectId("5273f6ee7c6c502364ddfe96"), "n" : -5
那么下面的命令会为你创建一个排序好的集合
db.test.find().sort(n : 1).forEach(function(e)
db.testSorted.insert(e);
)
与您可以实现的方式完全相同(我认为可能会执行得更快,但我没有进行任何测试):
db.testSorted.insert(db.test.find().sort(n : 1).toArray());
为了让这个答案完整,我也明白这是一个矫枉过正,你可以用aggregation framework option $out做到这一点。
只是为了强调:通过所有这些,您可以解决更大的问题:将先前集合的某种修改/子集保存到另一个集合中。
【讨论】:
插入顺序只保证capped collection,所以这个建议并不像你建议的那样维护一个真正的排序集合。普通集合中的文档存储在natural order 中,这受文档移动(当文档增长大于分配的记录空间时)和删除(空闲空间可以重新用于插入/移动的文档)的影响。索引是以预期的排序顺序返回文档的适当方式。 @Stennie 感谢您告诉我移动可能存在的问题。但我没有告诉过这会创建一个在之后一直排序的集合。我只是告诉了操作完成后,集合将被排序。如果您将在集合中进行更新或新插入,则不会保留该顺序。我还强调了唯一的方法是使用排序进行查找。【参考方案2】:集合中的文档存储在natural order 中,这受文档移动(当文档增长大于当前分配的记录空间时)和删除(空闲空间可以重新用于插入/移动的文档)的影响。目前(在 MongoDB 2.4 中)除了使用 capped collection 之外,没有其他选项可以控制磁盘上文档的顺序,这是一个固定大小的集合,可以保持插入顺序,但受制于 number of restrictions。
索引是以预期的排序顺序有效返回文档的适当方式。有关详细信息,请参阅:MongoDB 手册中的Using Indexes to Sort Query Results。
一个相关的特性是clustered index,它将文档存储在磁盘上以匹配索引排序。这不是 MongoDB 的当前功能,尽管它已被请求(参见 SERVER-3294)。
【讨论】:
以上是关于在MongoDB中永久排序集合的主要内容,如果未能解决你的问题,请参考以下文章