2014-08-06 3 views
5

Я хочу вернуть true, если идентификатор пользователя уже существует, а false - в противном случае из моей коллекции. У меня есть эта функция, но она всегда возвращает True.MongoDB return True, если существует документ

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

Как я могу заставить эту функцию возвращать true только в том случае, если идентификатор пользователя уже существует?

ответ

17

find не возвращает логическое значение, оно возвращает cursor. Чтобы проверить, содержит ли этот курсор какие-либо документы, используйте метод count cursors.

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

К слову: новыйID массив? Когда это не так, вы не должны использовать $in -оператор. Вы можете просто сделать find({'UserIDS': newID})

+5

Я хотел бы только добавить к этому ответу, чтобы включить проектор с только «_id»: 1 комплект так как БД не возвращает целый объект, каждый мс и байт подсчитывает :) – JoeManFoo

+3

Предельный результат, установленный в 1 с .limit (1), может быть еще одним ценным намеком на базу данных – Konstantin

+0

@Konstantin Итак, используйте find_one() inste объявление? –

4

Если вы используете мотор, найти() не выполняет никакой связи с базой данных, он просто создает и возвращает MotorCursor:

http://motor.readthedocs.org/en/stable/api/motor_collection.html#motor.MotorCollection.find

Поскольку MotorCursor является не None, Python считает это «истинным» значением, поэтому ваша функция возвращает True. Если вы хотите знать, если хотя бы один документ существует, который соответствует вашему запросу, попробуйте find_one():

@gen.coroutine 
def alreadyExists(newID): 
    doc = yield db.mycollection.find_one({'UserIDS': { "$in": newID}}) 
    return bool(doc) 

Обратите внимание вам нужно «сопрограмму» и «выход», чтобы сделать ввод/вывод с Tornado. Вы можете также использовать функцию обратный вызов:

def alreadyExists(newID, callback): 
    db.mycollection.find_one({'UserIDS': { "$in": newID}}, callback=callback) 

Более подробную информацию о обратных вызовах и сопрограммах см обучающего мотора:

http://motor.readthedocs.org/en/stable/tutorial.html

Если вы используете PyMongo, а не двигатель, это проще:

def alreadyExists(newID): 
    return bool(db.mycollection.find_one({'UserIDS': { "$in": newID}})) 

Заключительное примечание: оператор MongoDB в $ принимает список значений. Является ли newID списком? Возможно, вы просто хотите:

find_one({'UserIDS': newID}) 
+0

Как написать это в Mongo Shell? Сделать Mongo Shell возвратом boolean. –

0

Я думаю, что очень поздно выложить решение. В любом случае, я столкнулся с такой же проблемой сегодня, и после этого работал на меня. Надейтесь, что это поможет другим.

if db.mycollection.find({'UserIDS': newID}).count > 0: 
     return True 
else: 
     return False 
0

Одно решение лайнера в MongoDB запроса

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

Это работало для меня

result = num.find({"num": num}, { "_id": 0 }) 
if result.count() > 0: 
    return 
else: 
    num.insert({"num": num, "DateTime": DateTime }) 
Смежные вопросы