enter image description here

Voici la structure du document mongo DB fournie ci-dessus dans l'image. Là, vous pouvez voir que nous avons un tableau xmlRequests sous le tableau de pages (Pages est un tableau d'objets). Ainsi, chaque session a un tableau de pages contenant des objets

Ce que je veux faire:

Disons que nous avons 10 documents avec la même structure que celle montrée dans l'image ci-dessus. Je veux le tableau agrégé (unifié) de toutes les pages sous toutes les sessions dans un seul tableau. En termes simples, je veux le tableau de pages de toutes les sessions dans un seul tableau. (Agrégat)

Comme ceci:

{
 pages : [] // array containing all the objects of request arrays under each session.
}

J'ai besoin d'un tableau unifié de demandes [] contenant toutes les demandes de toutes les sessions dans un seul tableau. J'ai essayé d'utiliser db.collection.aggregate ([]) mais je ne sais pas comment obtenir les valeurs imbriquées dans un document et les unifier toutes dans un seul tableau d'objets.

Extrait de code Mongo

{
 "user": "abc",
 "sessions": {
 "12345": {
    "pages": [
        {
            requests: [ {name: 'request1'}]
        }
    ]
    },
  "23456": {
    "pages": [
        {
            requests: [ {name: 'request1'}]
        }
    ]
    }
    }
}

{
  "user": "xyz",
  "sessions": {
  "12345": {
    "pages": [
        {
            requests: [ {name: 'request1'}]
        }
    ]
    },
   "23456": {
    "pages": [
        {
            requests: [ {name: 'request1'}]
        }
    ]
     }
    }
   }

RECHERCHEZ TOUTES LES TABLEAUX DE DEMANDES DE LA COLLECTION ET COMBINEZ-LES EN UNE SEULE ARRAY

1
Mohammad Basit 3 sept. 2020 à 09:39

2 réponses

Meilleure réponse

Vous pouvez commencer avec $ objectToArray afin de récupérer des valeurs d'inconnu clés. Ensuite, vous avez besoin de quelques $ réduire / < a href = "https://docs.mongodb.com/manual/reference/operator/aggregation/concatArrays/index.html" rel = "nofollow noreferrer"> $ concatArrays paires pour aplatir les tableaux de tableaux. $ group peut être utilisé pour collecter toutes les demandes dans un seul document:

db.collection.aggregate([
    {
        $project: {
            pages: {
                $reduce: {
                    input: { $objectToArray: "$sessions" },
                    initialValue: [],
                    in: {
                        $concatArrays: [
                            "$$value",
                            {
                                $reduce: {
                                    input: "$$this.v.pages",
                                    initialValue: [],
                                    in: { $concatArrays: [ "$$value", "$$this.requests" ] }
                                }
                            }
                        ]
                    }
                }
            }
        }
    },
    {
        $group: {
            _id: null,
            pages: { $push: "$pages" }
        }
    },
    {
        $project: {
            pages: {
                $reduce: {
                    input: "$pages",
                    initialValue: [],
                    in: { $concatArrays: [ "$$value", "$$this" ] }
                }
            }
        }
    }
])

Aire de jeux de Mongo

1
mickl 3 sept. 2020 à 07:02

Essayez ceci. Fondamentalement, nous déroulons les premières pages du tableau afin d'obtenir une énorme liste de pages. Ensuite, nous regroupons tous les tableaux de requêtes xml dans un seul grand tableau. Et puis nous les fusionnons en un seul tableau et retournons un objet avec une demande de clé contenant le tableau final

    .aggregate([{
         $unwind: “$pages”,
    },
    {
         $group: {
              _id: null,
              xmlRequests: { $push: "$xmlRequests"}
          }
    },
    {
        $project: {
             _id: 0,
             requests: {
                $reduce: {
                    input: "$xmlRequests",
                    initialValue: [],
                     in: {
                         $concatArrays: [ "$$this", "$$value"]
                     }
                 }
             }
         }
    }])
0
Edward Romero 3 sept. 2020 à 07:02