我们需要迭代特定集合中所有文档的ID,这些文档包含二进制数据字段。
当我们使用仅返回_id字段的投影查询时,查询大约需要80秒才能返回200000个结果。
是否有更快的方法来获取仅包含_id字段的游标,并且不会因二进制数据字段的大小而降级? 如果我们从所有文档中删除数据字段,则查询将在几百毫秒内返回。
在mongo shell中重现的步骤:
function randomString() {
var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
var randomstring = '';
var string_length = 64000;
for (var i=0; i<string_length; i++) {
var rnum = Math.floor(Math.random() * chars.length);
randomstring += chars.substring(rnum,rnum+1);
}
return randomstring;
}
var data = randomString()
for (var i = 1; i <= 200000; i++) { db.testData.insert({data: new BinData(0, data)}) }
var cursor = db.testData.find({}, {_id: true})
cursor.forEach(printjson)
答案 0 :(得分:1)
我们发现长查询时间是由于索引的排序顺序可能不同,导致mongodb在运行查询时需要访问文档,即使索引覆盖了查询。
因为_id上的索引按升序排序,所以只需对find进行排序就会在100毫秒内返回结果:
var cursor = db.testData.find({}, {_id: true}).sort({_id: 1})
答案 1 :(得分:0)
在我的情况下花费那么长的时间似乎是正常的...... 75000毫秒。
为什么必须遍历_id?你在找什么?也许您可以添加时间戳或使用集成在id中的时间戳。然后,您可以限制选择或指定查找顺序。
PS。:如果查找不够,聚合订单有更多选项。