Je souhaite renvoyer la valeur true si un ID utilisateur existe déjà et la valeur False sinon de ma collection. J'ai cette fonction, mais elle renvoie toujours True
.
def alreadyExists(newID):
if db.mycollection.find({'UserIDS': { "$in": newID}}):
return True
else:
return False
Comment pourrais-je obtenir que cette fonction ne retourne que vrai si un identifiant d'utilisateur existe déjà?
find
ne renvoie pas de valeur booléenne, il retourne un curseur . Pour vérifier si ce curseur contient des documents, utilisez la méthode count des curseurs.
if db.mycollection.find({'UserIDS': { "$in": newID}}).count() > 0
.
Au fait: newID est-il un tableau? Sinon, vous ne devez pas utiliser l'opérateur $in
-. Vous pouvez simplement faire find({'UserIDS': newID})
Si vous utilisez Motor, find () n'effectue aucune communication avec la base de données, il crée et renvoie simplement un MotorCursor:
http://motor.readthedocs.org/fr/stable/api/motor_collection.html#motor.MotorCollection.find
Comme le MotorCursor n'est pas None, Python considère qu'il s'agit d'une valeur "true", de sorte que votre fonction renvoie True. Si vous voulez savoir s'il existe au moins un document correspondant à votre requête, essayez find_one ():
@gen.coroutine
def alreadyExists(newID):
doc = yield db.mycollection.find_one({'UserIDS': { "$in": newID}})
return bool(doc)
Notez que vous avez besoin d'une "coroutine" et d'un "rendement" pour effectuer des E/S avec Tornado. Vous pouvez également utiliser un rappel:
def alreadyExists(newID, callback):
db.mycollection.find_one({'UserIDS': { "$in": newID}}, callback=callback)
Pour plus d'informations sur les callbacks et les routines, consultez le didacticiel de Motor:
http://motor.readthedocs.org/fr/stable/tutorial.html
Si vous utilisez PyMongo et pas Motor, c'est plus simple:
def alreadyExists(newID):
return bool(db.mycollection.find_one({'UserIDS': { "$in": newID}}))
Note finale, l'opérateur $ in de MongoDB prend une liste de valeurs. NewID est-il une liste? Peut-être que vous voulez juste:
find_one({'UserIDS': newID})
À partir de Mongo 4.0.3
/PyMongo 3.7.0
, nous pouvons utiliser count_documents
:
if db.collection.count_documents({ 'UserIDS': newID }, limit = 1) != 0:
# do something
Utilisé avec le paramètre facultatif limit
, cela permet de déterminer s’il existe au moins une occurrence correspondante.
En limitant le nombre d'occurrences correspondantes, l'analyse de la collection s'arrête dès qu'une correspondance est trouvée au lieu de parcourir l'intégralité de la collection.
Notez que ceci peut également être écrit comme suit puisque 1
est interprété comme True
dans une condition python:
if db.collection.count_documents({ 'UserIDS': newID }, limit = 1):
# do something
Dans les versions antérieures de Mongo
/Pymongo
, count
pourrait être utilisé (obsolète et remplacé par count_documents
dans Mongo 4
):
if db.collection.count({ 'UserIDS': newID }, limit = 1) != 0:
# do something
Je suppose que je suis très en retard pour poster la solution. En tout cas, j'ai rencontré le même problème aujourd'hui et la suite a fonctionné pour moi. J'espère que cela aidera les autres.
return db.mycollection.find({'UserIDS': newID}).count > 0
Cela a fonctionné pour moi
result = num.find({"num": num}, { "_id": 0 })
if result.count() > 0:
return
else:
num.insert({"num": num, "DateTime": DateTime })
Une solution de doublure dans la requête mongodb
db.mycollection.find({'UserIDS': { "$in": newID}}).count() > 0 ? true : false