IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

[pymongo] Comment utiliser un $elemMatch de mongodb


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 241
    Par défaut [pymongo] Comment utiliser un $elemMatch de mongodb
    Bonjour,

    Voici une requête mongodb qui fonctionne très bien et qui retourne des documents :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    Restaurants qui ont des scores de grade C ET des scores strictement inférieurs à 30 :
     
     
    db.getCollection('restaurants').find({
    'grades': {
        $elemMatch: {
            'grade': 'C',
            'score': {
                $lt:30
            }
        }
        }
    },
    {'grades.grade': 1, "grades.score": 1}
    )
    Je souhaite l'utiliser avec pymongo mais je ne trouve pas d'équivalent de $elemMatch en pymongo :

    Voici le test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    req = collect.find({
        '$elemMatch': {
            'grades.grade': 'C',
            'grades.score': {'$lt':30}
        }},
        {'grades.grade': 1, "grades.score": 1}
    ).limit(1)
    
    for r in req:
        pprint.pprint(r)
        pass

    Le message d'erreur suivant est retourné : pymongo.errors.OperationFailure: unknown top level operator: $elemMatch, full error.

    Donc, problème.

    Comment donc faire cette requête ?

    Merci d'avance.

    A+

  2. #2
    Membre éprouvé Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 153
    Par défaut
    Hello ,

    As-tu essayé avec $match à la place de $elemMatch , il me semble de mémoire que c'est ça

  3. #3
    Membre extrêmement actif Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 241
    Par défaut
    Citation Envoyé par olivier1969 Voir le message
    Hello ,

    As-tu essayé avec $match à la place de $elemMatch , il me semble de mémoire que c'est ça
    Bonjour,

    J'ai essayé avec $match et comme dans mongodb cela donne un OU entre les 2 requêtes. Je cherche à avoir un ET entre 2 requêtes et non un OU : avec mongodb on utilise $elemMatch pour cela.

    Donc je n'ai pas encore trouvé comment faire cela.

    A+

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 828
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 828
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Mister Nono Voir le message
    Le message d'erreur suivant est retourné : pymongo.errors.OperationFailure: unknown top level operator: $elemMatch, full error.

    Donc, problème.

    Comment donc faire cette requête ?
    La requête MongoDB possède un "top level" qui est "grades". Donc il me semble que son équivalent Python devrait avoir le même top level =>
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    req = collect.find(
    	{
    		'grades' : {
    			'$elemMatch': {
    				'grade': 'C',
    				'score': {'$lt':30}
    	    	}
    	},
    	{'grades.grade': 1, "grades.score": 1},
    )
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre éprouvé Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 153
    Par défaut
    Testé chez moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    query = {  '$and' : [{'grades.grade': 'C'}, {'grades.score': {'$lt':30}} ] }
    labels = { 'grades.grade' : 1, 'grades.score' : 1 }
    
    req = collect.find( query , labels )

  6. #6
    Membre extrêmement actif Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 241
    Par défaut
    Citation Envoyé par olivier1969 Voir le message
    Testé chez moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    query = {  '$and' : [{'grades.grade': 'C'}, {'grades.score': {'$lt':30} }] }
    labels = { 'grades.grade' : 1, 'grades.score' : 1 }
    
    req = collect.find( query , labels )
    Merci beaucoup olivier1969.

    Et oui, il fallait y penser.

    Encore bravo. +1

  7. #7
    Membre éprouvé Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 153
    Par défaut
    De rien

Discussions similaires

  1. Comment utiliser JSF avec MongoDB ?
    Par boukinov dans le forum JSF
    Réponses: 5
    Dernier message: 04/02/2015, 17h37
  2. Réponses: 4
    Dernier message: 24/02/2009, 12h06
  3. comment utiliser actionscript ?
    Par webs dans le forum Flash
    Réponses: 3
    Dernier message: 09/02/2003, 23h11
  4. Comment utiliser OUT ?
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 3
    Dernier message: 20/07/2002, 09h35
  5. Réponses: 5
    Dernier message: 11/06/2002, 15h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo