2

每当我们执行 db.Collection.find().sort() 时,只有我们的输出被排序,而不是集合本身,

即,如果我执行 db.collection.find() 那么我看到的是原始集合,而不是排序的集合。

有没有办法对集合本身进行排序而不是对输出进行排序?

将排序结果导出到整个新集合中也可以。

如果我有编号 _id 字段。(如 _id:1 , _id_2 , _id:3 等等)

4

2 回答 2

6

此外,我看不出有任何这样做的理由(您要对其进行排序的字段上的索引将帮助您快速进行排序),这是您问题的解决方案:

你有你的测试集合这样

{ "_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());

为了使这个答案完整,我也知道这是一种矫枉过正的做法,您可以使用聚合框架选项 $out来做到这一点。

只是为了强调:通过所有这些您可以解决更大的问题:将先前集合的某种修改/子集保存到另一个集合中。

于 2013-11-01T18:59:24.280 回答
0

集合中的文档以自然顺序存储,受文档移动(当文档增长大于当前分配的记录空间时)和删除(空闲空间可以重新用于插入/移动的文档)的影响。目前(在 MongoDB 2.4 中)除了使用capped collection之外,没有其他选项可以控制磁盘上的文档顺序,这是一个固定大小的集合,可以保持插入顺序,但受到许多限制

索引是以预期的排序顺序有效地返回文档的适当方法。有关更多信息,请参阅:MongoDB 手册中的使用索引对查询结果进行排序。

一个相关的特性是聚集索引,它将文档存储在磁盘上以匹配索引顺序。这不是 MongoDB 的当前功能,尽管它已被请求(请参阅SERVER-3294)。

于 2013-11-03T05:03:43.423 回答