在Mongodb中,如果想检查一个文档是否存在,最高效的方法应该是使用find()+count(),而不是使用find_one()。
一般来说,我们第一感觉会认为find_one()最高效,但是find_one()每次查找会同时读取文档,这相比find()返回一个cursor,会慢不少。
David Mytton,在《Checking if a document exists – MongoDB slow findOne vs find》 (2013),指出了这个区别。
在我目前使用的pymongo 3.7.2中,无法像其文中所述,使用limit()判断返回的cursor是否存在,而需要count()判断返回的cursor是否包含文档。
因此,使用
db.collection.find({"username":"abc"}).count() db.collection.find({"username":{"$in":usernames}).count() # 如果usernames是一个列表
来替代:
db.collection.find_one({_id: "myId"}, {_id: 1})