web-dev-qa-db-fra.com

MongoDB renvoie True si le document existe

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à?

14
user94628

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})

26
Philipp

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})
4

À 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
1
Xavier Guihot

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
0
Prateek Jha

Cela a fonctionné pour moi

result = num.find({"num": num}, { "_id": 0 }) 
if result.count() > 0:  
   return
else:
   num.insert({"num": num, "DateTime": DateTime })
0
siva kumar

Une solution de doublure dans la requête mongodb

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