MongoDB如果文档存在返回True
我想要在我的数据集中检查一个用户ID是否已经存在,如果存在就返回真(true),如果不存在就返回假(false)。我有这个函数,但它总是返回真(True
)。
def alreadyExists(newID):
if db.mycollection.find({'UserIDS': { "$in": newID}}):
return True
else:
return False
我该怎么做才能让这个函数只有在用户ID已经存在的情况下才返回真呢?
6 个回答
在MongoDB查询中,一行代码的解决方案
db.mycollection.find({'UserIDS': { "$in": newID}}).count() > 0 ? true : false
return db.mycollection.find({'UserIDS': newID}).count > 0
当然可以!请把你想要翻译的内容发给我,我会帮你把它变得更简单易懂。
如果你在使用Motor,find()这个方法其实并不会和数据库进行任何通信,它只是创建并返回一个MotorCursor对象。
http://motor.readthedocs.org/en/stable/api/motor_collection.html#motor.MotorCollection.find
因为MotorCursor不是空的,Python会把它当作“真的”值,所以你的函数返回True。如果你想知道是否至少有一个文档符合你的查询,可以试试find_one()这个方法:
@gen.coroutine
def alreadyExists(newID):
doc = yield db.mycollection.find_one({'UserIDS': { "$in": newID}})
return bool(doc)
注意,你需要使用“协程”和“yield”来进行I/O操作,这在Tornado中是必要的。你也可以使用回调函数:
def alreadyExists(newID, callback):
db.mycollection.find_one({'UserIDS': { "$in": newID}}, callback=callback)
想了解更多关于回调和协程的内容,可以查看Motor的教程:
http://motor.readthedocs.org/en/stable/tutorial.html
如果你使用的是PyMongo而不是Motor,那就简单多了:
def alreadyExists(newID):
return bool(db.mycollection.find_one({'UserIDS': { "$in": newID}}))
最后要提一下,MongoDB的$in操作符需要一个值的列表。newID是一个列表吗?也许你只是想要:
find_one({'UserIDS': newID})
从 Mongo 4.0.3
和 PyMongo 3.7.0
开始,我们可以使用 count_documents
这个功能:
if db.collection.count_documents({ 'UserIDS': newID }, limit = 1) != 0:
# do something
如果加上可选的参数 limit
,就可以用来检查是否至少有一个匹配的结果。
通过限制匹配结果的数量,可以让查找在找到第一个匹配项后就停止,而不是继续遍历整个集合。
需要注意的是,这个功能也可以这样写,因为在 Python 的条件判断中,1
被视为 True
:
if db.collection.count_documents({ 'UserIDS': newID }, limit = 1):
# do something
在早期版本的 Mongo
和 Pymongo
中,可以使用 count
(这个功能已经被弃用,并在 Mongo 4
中被 count_documents
替代):
if db.collection.count({ 'UserIDS': newID }, limit = 1) != 0:
# do something
注意:这个回答已经过时了。更新版本的MongoDB可以使用更高效的方法
db.collection.countDocuments
。可以查看Xavier Guihot的回答,那里有更好的解决方案。
find
方法不会返回一个布尔值(也就是真或假),它返回的是一个游标。要检查这个游标里是否有任何文档,可以使用游标的 count
方法:
if db.mycollection.find({'UserIDS': { "$in": newID}}).count() > 0
如果 newID
不是一个数组,你就不应该使用 $in
操作符。你可以直接使用 find({'UserIDS': newID})
。