如果userID已经存在,我想返回true,否则我想从我的collection中返回false。我有这个函数,但它总是返回True
。
def alreadyExists(newID):
if db.mycollection.find({'UserIDS': { "$in": newID}}):
return True
else:
return False
如果用户ID已经存在,我怎么能让这个函数只返回true?
答案 0 :(得分:26)
注意:此答案已过时。更新版本的MongoDB可以使用效率更高的方法
db.collection.countDocuments
。请参阅Xavier Guihot的the answer以获得更好的解决方案。
find
没有返回布尔值,它返回cursor。要检查该游标是否包含任何文档,请使用游标计数方法。
if db.mycollection.find({'UserIDS': { "$in": newID}}).count() > 0
。
顺便说一下:newID是一个数组吗?如果不是,则不应使用$in
- 运算符。您只需执行find({'UserIDS': newID})
答案 1 :(得分:4)
如果您正在使用Motor,find()不与数据库进行任何通信,它只会创建并返回MotorCursor:
http://motor.readthedocs.org/en/stable/api/motor_collection.html#motor.MotorCollection.find
由于MotorCursor不是None,Python认为它是" true"值,所以你的函数返回True。如果您想知道是否存在至少一个与您的查询匹配的文档,请尝试使用find_one():
@gen.coroutine
def alreadyExists(newID):
doc = yield db.mycollection.find_one({'UserIDS': { "$in": newID}})
return bool(doc)
注意你需要一个" coroutine"和"产量"用Tornado做I / O.您也可以使用回调:
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})
答案 2 :(得分:3)
从Mongo 4.0.3
/ PyMongo 3.7.0
开始,我们可以使用count_documents
:
if db.collection.count_documents({ 'UserIDS': newID }, limit = 1) != 0:
# do something
与可选参数limit
一起使用,这提供了一种方法来查找是否至少有一个匹配项。
限制匹配项的出现次数会使集合扫描在找到匹配项后立即停止,而不是遍历整个集合。
请注意,由于1
在python条件下被解释为True
,因此也可以这样写:
if db.collection.count_documents({ 'UserIDS': newID }, limit = 1):
# do something
在Mongo
/ Pymongo
的早期版本中,可以使用count
(在count_documents
中已弃用并由Mongo 4
代替):
if db.collection.count({ 'UserIDS': newID }, limit = 1) != 0:
# do something
答案 3 :(得分:0)
我想发布解决方案的时间已经很晚了。无论如何,我今天遇到了同样的问题,后来为我工作。希望对别人有所帮助。
return db.mycollection.find({'UserIDS': newID}).count > 0
答案 4 :(得分:0)
mongodb查询中的一个线性解决方案
db.mycollection.find({'UserIDS': { "$in": newID}}).count() > 0 ? true : false
答案 5 :(得分:0)
这对我有用
result = num.find({"num": num}, { "_id": 0 })
if result.count() > 0:
return
else:
num.insert({"num": num, "DateTime": DateTime })