MongoDB如果文档存在返回True

40 投票
6 回答
83489 浏览
提问于 2025-04-18 16:15

我想要在我的数据集中检查一个用户ID是否已经存在,如果存在就返回真(true),如果不存在就返回假(false)。我有这个函数,但它总是返回真(True)。

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

我该怎么做才能让这个函数只有在用户ID已经存在的情况下才返回真呢?

6 个回答

1

在MongoDB查询中,一行代码的解决方案

db.mycollection.find({'UserIDS': { "$in": newID}}).count() > 0 ? true : false
1
return db.mycollection.find({'UserIDS': newID}).count > 0

当然可以!请把你想要翻译的内容发给我,我会帮你把它变得更简单易懂。

3

如果你在使用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})
49

Mongo 4.0.3PyMongo 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

在早期版本的 MongoPymongo 中,可以使用 count(这个功能已经被弃用,并在 Mongo 4 中被 count_documents 替代):

if db.collection.count({ 'UserIDS': newID }, limit = 1) != 0:
  # do something
48

注意:这个回答已经过时了。更新版本的MongoDB可以使用更高效的方法 db.collection.countDocuments。可以查看Xavier Guihot的回答,那里有更好的解决方案。

find 方法不会返回一个布尔值(也就是真或假),它返回的是一个游标。要检查这个游标里是否有任何文档,可以使用游标的 count 方法:

if db.mycollection.find({'UserIDS': { "$in": newID}}).count() > 0

如果 newID 不是一个数组,你就不应该使用 $in 操作符。你可以直接使用 find({'UserIDS': newID})

撰写回答