在Mongodb中永久排序集合

时间:2013-11-01 16:11:40

标签: mongodb sorting

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

即。如果我做db.collection.find()然后我看到原始集合,而不是排序的集合。

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

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

2 个答案:

答案 0 :(得分:3)

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

你有这样的测试集合

{ "_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来做到这一点。

只是为了突出显示:有了这一切,你可以解决更大的问题:保存到另一个集合中某种修改/以前集合的子集。

答案 1 :(得分:0)

集合中的文档存储在natural order中,受文档移动影响(当文档长度大于分配的当前记录空间时)和删除(可以为插入/移动的文档重用可用空间)。目前(如MongoDB 2.4)除了使用capped collection之外,没有选项来控制磁盘上的文档顺序,number of restrictions是一个固定大小的集合,维护插入顺序但受Using Indexes to Sort Query Results的约束。

索引是以预期排序顺序有效返回文档的适当方式。有关更多信息,请参阅MongoDB手册中的clustered index

相关功能是SERVER-3294,它会将文档存储在磁盘上以匹配索引顺序。这不是MongoDB的当前功能,尽管已经请求(参见{{3}})。