11
votes

Sélectionnez * Groupe par Agrégation de Mongo

J'essaie de faire quelque chose que je pense est assez simple. Supposons que j'ai une série d'enregistrements en Mongo qui ont une clé commune et un nombre variable d'attributs. Je souhaite sélectionner tous les attributs et le groupe par nom à travers les enregistrements. Par exemple xxx

Je voudrais produire un CSV qui ressemble à ceci: xxx

essayé xxx < / Pré>

Malheureusement, je récupère tous les noms comme enregistrements, mais pas l'union de tous les attributs possibles.


0 commentaires

4 Réponses :


11
votes

Si vous souhaitez combiner les attributs, vous devez ajouter celles au groupe . Par exemple, en utilisant $ addtoset pour trouver le Valeurs uniques des attributs X, Y, Z regroupés par chaque nom: xxx

retourne: xxx


5 commentaires

Merci, j'ai fait une chose similaire en utilisant $ push et il semble fonctionner. Ma question de suivi serait de savoir si à partir de ce que le meilleur moyen est d'exporter les données sur un CSV plat, déroulant les matrices internes dans le jeu de résultats?


J'utilise Pymongo et Python pour créer le CSV. Le seul problème est que lorsque j'utilise $ addtoSet, je crée des tableaux de résultats pour chaque clé, même s'il n'y a qu'une seule valeur distincte pour chaque paire de valeurs de clé. Cela rend alors le processus d'aplatissement de CSV très encombrant. Y a-t-il un moyen d'éviter de créer les tableaux de valeurs essentielles?


@ROGERSANCHEZ: $ addtoSet ou $ pression retournera des valeurs de tableau, de sorte que vous devrez effectuer un massage dans votre exportation de CSV ou envisager une fonction d'agrégation différente. Par exemple, si toutes les valeurs sont numériques et que vous ne disposez que d'une valeur unique par champ, vous pourrez peut-être vous éloigner avec $ max à la place. Si les valeurs de résultat sont des tableaux parfois , vous devrez vous disputer dans votre code. Voici un exemple de gist python qui peut aider: ALIMENTATION DES RETRAITS AGG aux cordes citées dans CSV .


Bonne référence. J'ai fini par résoudre le problème de l'aplatissement de manière plus manuelle en créant des listes contenant les noms de clés que je souhaite, puis en utilisant Wriditt vers le fichier CSV. Fonctionne bien. Merci encore pour la réponse originale du regroupement de Mongo qui était la partie délicate.


J'ai fait une mongotry pour vérifier le résultat: Mongotry.herokuapp.com/...



0
votes

Voici l'autre moyen de le faire:

Array
(
    [retval] => Array
        (
            [0] => Array
                (
                    [Name] => George
                    [x] => 
                    [y] =>
                    [z] =>
                    [count] => 2
                )

            [1] => Array
                (
                    [Name] => Rob
                    [x] => 
                    [y] =>
                    [z] =>
                    [count] => 1
                )

        )

    [count] => 5
    [keys] => 3
    [ok] => 1
)


4 commentaires

Tandis que groupe est une option viable tant que votre collection n'est pas faite, vous ne devez pas utiliser des exemples PHP dans des questions non PHP.


@Johnnyhk: Je cherchais depuis longtemps, j'ai eu ce lien dans la pile, mais cela ne m'a pas donné la réponse appropriée, alors quand j'ai trouvé la réponse que j'ai postée ici, quelqu'un peut le trouver utile, si vous voulez vraiment Voulez-vous que je puisse supprimer, je peux le faire.


Jusque à vous, mais agrégat est une meilleure solution dans ce cas et des exemples devraient être en JavaScript si possible, car c'est la langue «natif» de Mongo. Pas de soucis, il suffit de vous faire savoir.


@Prasanthbendra: La question initiale était sur le cadre d'agrégation plutôt que sur groupe () ;-). Votre exemple n'est pas non plus complet pour obtenir les résultats groupés par nom et compte d'attributs (x, y, z). Vous n'avez actuellement que groupé par nom équivalent à la description d'origine.



-1
votes

Utiliser $ addtoset au groupe, il fonctionnera xxx


0 commentaires

0
votes

La solution de STNNIE vous nécessite de savoir exactement quels attributs que vous souhaitez revenir de chaque élément correspondant de la collection que vous interrogez. Ce n'est pas toujours le cas.

Nous avons dû résoudre ce problème dans une application groovy sur Graves que nous écrivons.

Nous avons écrit une méthode comme celle-ci pour gérer les demandes "trouvée par x" : xxx

puis l'appelez dans notre code comme suit: xxx

Ceci fonctionne en faisant passer les résultats de l'initiale Requête à la fonction JavaScript à la fin du groupeCommand. Mongo ne renvoie que les attributs que vous spécifiez dans la requête initiale et rien d'autre, vous devez donc itération sur les résultats une 2e fois, les peupler avec le reste des données de Mongo.


0 commentaires