Если вы используете мотор, найти() не выполняет никакой связи с базой данных, он просто создает и возвращает 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})
Я хотел бы только добавить к этому ответу, чтобы включить проектор с только «_id»: 1 комплект так как БД не возвращает целый объект, каждый мс и байт подсчитывает :) – JoeManFoo
Предельный результат, установленный в 1 с .limit (1), может быть еще одним ценным намеком на базу данных – Konstantin
@Konstantin Итак, используйте find_one() inste объявление? –