如果文档存在,MongoDB返回True

use*_*628 17 python mongodb pymongo tornado-motor

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

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

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

Phi*_*ipp 28

db.collection.countDocuments不返回布尔值,它返回一个游标.要检查该游标是否包含任何文档,请使用游标计数方法.

find.

顺便说一下:newID是一个数组吗?如果不是,则不应使用if db.mycollection.find({'UserIDS': { "$in": newID}}).count() > 0-operator.你可以干脆做$in

  • 我只想添加这个答案,包括一个只有'_id'的投影:1设置,因为DB不返回整个对象,每个ms和字节数:) (8认同)
  • 使用.limit(1)将结果集限制为1可能是数据库的另一个有价值的提示 (7认同)
  • 这是低效的。为了提高性能,我建议使用 Xavier 的答案中所述的“count_documents”。 (3认同)

Xav*_*hot 6

Mongo 4.0.3/ 开始PyMongo 3.7.0,我们可以使用count_documents

if db.collection.count_documents({ 'UserIDS': newID }, limit = 1) != 0:
  # do something
Run Code Online (Sandbox Code Playgroud)

与可选参数一起使用limit,这提供了一种方法来查找是否至少存在一个匹配项。

限制匹配项的出现次数将使集合扫描在找到匹配项后立即停止,而不是遍历整个集合。


请注意,这也可以写成如下,因为它1True在python条件下解释的:

if db.collection.count_documents({ 'UserIDS': newID }, limit = 1):
  # do something
Run Code Online (Sandbox Code Playgroud)

Mongo/的早期版本中Pymongocount可以使用(已弃用并由count_documentsin 代替Mongo 4):

if db.collection.count({ 'UserIDS': newID }, limit = 1) != 0:
  # do something
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢。该回复应该是列表中的第一个! (3认同)