最近,在实际使用中体会到了index的方便。
两个collection, collection1:
DbManifest {
sessionId: String,
...
}
collection2:
CmdEnd {
sessionId: String,
deviceId: String,
...
}
现在需要对DbManifest中的Document遍历,根据sessionId从CmdEnd查到对应的deviceId加入field deviceId。javascript代码:
1 var mongo = new Mongo(); 2 3 var db = mongo.getDB('xxx'); 4 5 var update_DbManifest = function () { 6 db.DbManifest.find().forEach(function (doc) { 7 if (doc.deviceId) { 8 // existed already 9 return; 10 } 11 var doc_cmd_end = db.CmdEnd.findOne({sessionId: doc.sessionId}); 12 if (doc_cmd_end) { 13 doc.deviceId = doc_cmd_end.deviceid; 14 db.DbManifest.save(doc); 15 } 16 }); 17 }; 18 19 update_DbManifest();
collection CmdEnd大概是百万级别,而DbManifest大约数万。从mongodb shell运行这段代码,耗时很长。原因在于对于DbManifest中的每个document,都必须对CmdEnd做全表搜索。
而在CmdEnd对sessionId做了索引后,只需数分钟就完成了原来需要十几个小时的工作。
db.CmdEnd.ensureIndex({"sessionId":1})
另外,mongodb中如果要查询不含某个特定field的document,可以这样:
db.coll.find({field_name: {$exists: false}})
关于index的使用,当提取较小的子集时,index会比较快。结果集在原集合中所占比例越大,index的效率就越低,因为index需要做两次查找:查找索引条目和根据索引指针去查找相应的文档,而全表查找只需要一次全表扫描。
浙公网安备 33010602011771号