在使用mongodb时,常遇到这样一种场景,就是你需要查看一个数据是否在数据库中,
那么这个时候你的选择就是find或者findOne了。今天,结合一些实验以及网上查阅的一些资料,
我准备详细的记录下这两个方法的差别和使用场景。
1.public DBCursor find( DBObject ref )
find
函数内部实现比较简单,就是新建了一个DBCursor
对象,源码如下:
2.public DBObject findOne( DBObject o )
而在findOne内部,函数经历两次跳转后,最终的实现逻辑其实还是在内部调用了find
函数,
找到所有符合条件的,然后返回第一个,源码如下:
所以从理论的角度看,如果只是检查符合某条件的对象是否存在,还是建议使用find().limit(1)
.
那么接下来就从实践的角度来看一下。
下面是我测试写的一段代码,其中的col_name中包含大于300万的记录,
程序输出如下:
可以看到在没有索引的情况下,findOne
的性能要好于find
,如果使用索引,则差别不大了。
事实证明,实践和理论推测还是有一点点距离的。
如果注释(comment)掉那8行包含if
和j++
的语句,程序的输出如下:
Refs:
1.https://blog.serverdensity.com/checking-if-a-document-exists-mongodb-slow-findone-vs-find/
2.http://dba.stackexchange.com/questions/7573/difference-between-mongodbs-find-and-findone-calls
blog comments powered by