2 votes

Recherche interne d'agrégats Mongoose regroupant par champ

J'essaie de regrouper tous les champs distincts, puis de faire une recherche dans une autre table. Le problème est que j'ajoute trop de résultats pour le même utilisateur dans la recherche, alors je me demande comment je peux regrouper ces résultats en interne, puis dans l'étape suivante, ajouter une autre recherche dans une autre table. Actuellement, j'ai le code suivant :

Post.aggregate([
    { "$group" : {"_id" : { "id_fanpage": "$id_fanpage" },"total": { $sum: 1 } } },
    {
      "$lookup": {
        "from": "v3_post_reaccion_angry",
        "localField": "_id.id_fanpage",
        "foreignField": "id_fanpage",
        "as": "resultingAngries"
      }
    },
    {
      "$lookup": {
        "from": "v3_post_reaccion_compartir",
        "localField": "_id.id_fanpage",
        "foreignField": "id_fanpage",
        "as": "resultingCompartir"
      }
    }
  ]).exec(function(err, results){
    console.log(results);
    return results
  }).then(success(res))

Ce que j'essaie de faire, c'est de distinguer les lignes de Post par "id_fanpage", puis de joindre une autre table par l'id_fanpage retourné, ce qui fonctionne comme prévu, mais les résultats sont les suivants :

{
        "_id": {
            "id_fanpage": "5a63a96d1aa940ca0ada1c82"
        },
        "total": 831,
        "resultingAngries": [
            {
                "_id": "5a71ccda1aa940dd154caf83",
                "id_post": "5a71ccda1aa940dd154caf82",
                "id_fanpage": "5a63a96d1aa940ca0ada1c82",
                "facebook_usuario_id": 345346565665,
                "facebook_usuario_nombre": "AAAAAAAAAAAAAAAAA"
            },
            {
                "_id": "5a71cd6b1aa940dd154ddb43",
                "id_post": "5a71cd6b1aa940dd154ddb40",
                "id_fanpage": "5a63a96d1aa940ca0ada1c82",
                "facebook_usuario_id": "44444444444444444",
                "facebook_usuario_nombre": "XXXXXXXXXXXXXXXX"
            },
            {
                "_id": "5a71d7f61aa940dd156b60f4",
                "id_post": "5a71d7f61aa940dd156b60e9",
                "id_fanpage": "5a63a96d1aa940ca0ada1c82",
                "facebook_usuario_id": "asdf12345232421",
                "facebook_usuario_nombre": "YYYYYYYYYYYYYY"
            },
            {
                "_id": "5a71cde11aa940dd154ec514",
                "id_post": "5a71cde11aa940dd154ec513",
                "id_fanpage": "5a63a96d1aa940ca0ada1c82",
                "facebook_usuario_id": "asdf2345234555",
                "facebook_usuario_nombre": "ZZZZZZZZZZZZZZ"
            },
            {
                "_id": "5a71cdcb1aa940dd154e917a",
                "id_post": "5a71cdcb1aa940dd154e9178",
                "id_fanpage": "5a63a96d1aa940ca0ada1c82",
                "facebook_usuario_id": "44444444444444444",
                "facebook_usuario_nombre": "XXXXXXXXXXXXXXX"
            }
        ]
        }

Le problème est que je veux regrouper tous les résultats dans resultingAngries par facebook_usuario_id et aussi être capable d'ajouter la même chose à la recherche suivante, mais pour autant que je sache, je ne peux pas utiliser un groupe après la première recherche sans affecter la recherche suivante. Donc le résultat devrait être :

{
        "_id": {
            "id_fanpage": "5a63a96d1aa940ca0ada1c82"
        },
        "total": 831,
        "resultingAngries": [
            {
                "_id": "this is my user id 1111111111",
                "count": N,
            },
            {
                "_id": "this is my user id 2222222222",
                "count": Y,
            }
         ],
        "resultingLikes": [
            {
                "_id": "this is my user id 1111111111",
                "count": N,
            },
            {
                "_id": "this is my user id 2222222222",
                "count": Y,
            }
         ],
   },
   {
    "_id": {
            "id_fanpage": "5a63a96d1aa942345wedf23455s"
        },
        "total": 20,
        "resultingLikes": [
            {
                "_id": "this is my user id 1111111111",
                "count": N,
            },
            {
                "_id": "this is my user id 2222222222",
                "count": Y,
            }
         ],
   },
     "resultingAngries": [
        {
            "_id": "this is my user id 1111111111",
            "count": N,
        },
        {
            "_id": "this is my user id 2222222222",
            "count": Y,
        }
     ],

Et ainsi de suite. J'ai déjà vu l'agrégation et les recherches et je ne suis pas sûr que $addToSet puisse le faire, parce que je ne peux pas grouper en interne jusqu'à présent, donc appliquer addToSet me donne du fil à retordre. Une aide serait appréciée.

0voto

Veeram Points 36230

Insérez ci-dessous trois étapes entre vos $lookup's.

Les étapes suivantes $unwind resultingAngries suivi du premier tableau $group pour compter la combinaison distincte de facebook_usuario_id & id_fanpage et le second $group a $push le site count y facebook_usuario_id dans resultingAngries le tableau.

  {"$unwind":"$resultingAngries"},
  {"$group":{
    "_id":{
      "id_fanpage":"$_id.id_fanpage",
      "facebook_usuario_id":"$resultingAngries.facebook_usuario_id"
    },
    "total":{"$first":"$total"},
    "count":{"$sum":1}
  }},
  {"$group":{
    "_id":{"id_fanpage":"$_id.id_fanpage"},
    "total":{"$first":"$total"},
    "resultingAngries":{
      "$push":{
        "_id":"$_id.facebook_usuario_id",
        "count":"$count"
      }
    }
  }}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X