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

NoSQL Discussion :

requête mongo aggregator fwk


Sujet :

NoSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 210
    Par défaut requête mongo aggregator fwk
    bonjour,

    j'ai cette structure de document dans un mongo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    {
        "_id" : ObjectId("54365a23398eaf05e8263ad6"),
        "build_id" : "601",
        "project_name" : "un_projet",
        "fail_reason" : "",
        "test_duration" : "16.21",
        "failure_type" : "",
        "error_log" : "",
        "test_name" : "shoult_test_something",
        "test_classname" : "com.toto.MonTest",
        "test_result_status" : "SKIPPED"
    }

    et je cherche la requête qui me permettrait de sortir ce résultat par projet et par build :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    {
        "project_name" : "un_projet",
        "build_id" : 601,
        "count_test_total" : 30,
        "count_test_result_status_SKIPPED" : 10, 
        "count_test_result_status_SUCCESS" : 10, 
        "count_test_result_status_FAILED" : 10
    }

    ma requête sur laquelle je pèche :
    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
    17
    18
    19
    20
    21
    22
     
    db.results.aggregate(
       [
          { $group: {
            _id: { project_name: '$project_name', build_id: '$build_id', test_result_status: '$test_result_status' }
          }},
     
          { $group: {
            _id: {test_result_status:'$_id.test_result_status', project_name:'$_id.project_name'},
            result: { $sum:'$_id' }
          }},
     
          { $project: {
            _id: 0,
            project_name:'$_id.project_name',
            test_result_status: '$_id.test_result_status',
            count:"$result"
          }}
     
     
       ]
    )

    merci d'avance

  2. #2
    Rédacteur

    Homme Profil pro
    Geek entrepreneur
    Inscrit en
    Novembre 2004
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Geek entrepreneur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 224
    Par défaut
    J'aurais plutot fait un premier $project pour séparer les types de résultats (SKIP, PASS, FAIL) avec un $cond.
    Ensuite, le $group peut se faire sur build_id, project_name et avec une somme sur les 3 champs nouvellement crées.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 210
    Par défaut
    Hello

    bon finalement j'ai presque trouvé :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    db.results.aggregate(
        { $project: {
            _id: 0,
            project_name: 1,
            build_id: 1,
            SKIPPED:  {$cond: [{$eq: ['$test_result_status',  'SKIPPED']}, 1, 0]},
            FAILED:  {$cond: [{$eq: ['$test_result_status',  'FAILED']},  1, 0]},
            ERROR:  {$cond: [{$eq: ['$test_result_status',  'ERROR']},   1, 0]},
            SUCCESS: {$cond: [{$eq: ['$test_result_status',  'SUCCESS']}, 1, 0]},
            BUILD_ID: "$build_id",
        }}  
        ,
        { $group: {
            _id: { project_name: '$project_name', build_id: '$build_id' },
            BUILD_IDd: {$max: '$BUILD_ID'},
            SKIPPED: {$sum: '$SKIPPED'},
            FAILED: {$sum: '$FAILED'},
            ERROR: {$sum: '$ERROR'},
            SUCCESS: {$sum: '$SUCCESS'}
        }}    
     
        //,{ $sort : { BUILD_IDd : -1 } }
        //,{ $limit : 1 }
        );

    mon pb maintenant c'est qu'il me retourne tous les builds de tous les projets.

    Comment faire pour ne récupérer que le dernier build ?
    car si je laisse les 2 dernier commentaires il me retourne qu'un seul enregistrement

    merci

    merci

  4. #4
    Rédacteur

    Homme Profil pro
    Geek entrepreneur
    Inscrit en
    Novembre 2004
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Geek entrepreneur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 224
    Par défaut
    Peux tu détailler ce que tu veux ?
    Tu veux le dernier build pour chaque projet ?
    Le dernier build tout projet confondu ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 210
    Par défaut
    Le dernier build de chaque project :

    si :
    - projet_1 a 56 builds
    - projet_2 a 23 builds

    je voudrais récupérer le build 56 pour projet_1 et le 23 pour le project_2

  6. #6
    Rédacteur

    Homme Profil pro
    Geek entrepreneur
    Inscrit en
    Novembre 2004
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Geek entrepreneur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 224
    Par défaut
    ok, donc il faudrait décommenter le dernier $sort et le faire suivre d'un $group sur le project_name en appliquant un $first pour ne prendre que la première valeur de chaque pile de build
    (http://docs.mongodb.org/manual/refer...egation/first/)

Discussions similaires

  1. Mongo aggregate $cond et arrays
    Par MiniDevZ dans le forum NoSQL
    Réponses: 0
    Dernier message: 19/05/2015, 16h44
  2. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  3. Requete requête sous sybase
    Par eddie dans le forum Sybase
    Réponses: 3
    Dernier message: 02/04/2003, 14h51
  4. Requête imbriquée et indexes INTERBASE
    Par vadim dans le forum InterBase
    Réponses: 2
    Dernier message: 06/09/2002, 16h15
  5. [BDD] Enregistrer le résultat d'une requête
    Par Mowgly dans le forum C++Builder
    Réponses: 5
    Dernier message: 19/06/2002, 15h26

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