如果文档存在,MongoDB返回True

时间:2014-08-06 14:55:45

标签: python mongodb pymongo tornado-motor

如果userID已经存在,我想返回true,否则我想从我的collection中返回false。我有这个函数,但它总是返回True

def alreadyExists(newID):
    if db.mycollection.find({'UserIDS': { "$in": newID}}):
        return True
    else:
        return False

如果用户ID已经存在,我怎么能让这个函数只返回true?

6 个答案:

答案 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 })