Accéder au contenu principal Passer au contenu complémentaire

Mapper des boucles imbriquées dans une map DSQL

Availability-noteBêta
Mappez des éléments à partir d'une entrée contenant plusieurs boucles imbriquées.

Avant de commencer

  • Vous avez créé des structures d'entrée et de sortie. Vous pouvez utiliser les échantillons JSON ci-dessous pour créer vos structures.

Pourquoi et quand exécuter cette tâche

Dans cet exemple, vous allez créer une map DSQL pour extraire des données relatives à un magasin, à partir d'un fichier plat JSON contenant plusieurs niveaux imbriqués et écrire ces données dans une structure plate JSON. Les données d'entrée ressemblent à ceci :
{
    "name": "plusstore",
    "location": "saint louis",
    "departments": [
        {
            "name": "sports",
            "salesperson_id": 25,
            "items": [
                {
                    "name": "MBIKE",
                    "description": "27.5 inch electric mountain bike"
                },
                {
                    "name": "ESCOOT",
                    "description": "Camou electric scooter"
                }
            ]
        },
        {
            "name": "electronics",
            "salesperson_id": 32,
            "items": [
                {
                    "name": "Portable SSD T5",
                    "description": "1 TB SSD USB-C"
                },
                {
                    "name": "Extreme Portable SSD",
                    "description": "500 GB SSD USB-C"
                }
            ]
        }
    ],
    "salespersons": [
        {
            "name": "Antonio Guttierez",
            "id": 25
        },
        {
            "name": "Gina Monsanto",
            "id": 32
        }
    ]
}
La structure de sortie ressemble à ceci :
{
    "items": [
        {
            "store_name": "",
            "store_location": "",
            "department_name": "",
            "salesperson_id": "",
            "salesperson_name": "",
            "item_name": ""
        }
    ]
}

Procédure

  1. Créez une DSQL Map (Map DSQL) et ajoutez les structures d'entrée et de sortie.
    Un premier mapping entre les éléments racine est automatiquement créé. Vous pouvez voir l'expression Data Shaping Query Language correspondante dans l'élément racine de la structure de sortie.
  2. Cliquez sur l'élément de sortie items et saisissez l'expression suivante pour configurer le contexte d'itération :
    FROM departments
    UNNEST items

    Cela signifie que la sortie va contenir une occurrence de items pour chaque élément items de chaque élément departments de l'entrée.

  3. Mappez les éléments suivants à l'aide du glisser-déposer :
    • plusstore.name à plusstoreitems.items.store_name
    • plusstore.location à plusstoreitems.items.store_location
    • plusstore.departments.name à plusstoreitems.items.department_name
    • plusstore.departments.salesperson_id à plusstoreitems.items.salesperson_id
    • plusstore.departments.items.name à plusstoreitems.items.item_name

    Vous pouvez voir que, dans quasiment tous les éléments, l'expression générée est un chemin relatif simple. Cela n'est pas possible pour store_name et department_name car le chemin relatif name ne peut faire référence qu'à plusstore.departments.items.name à cause du contexte d'itération. Pour plus d'informations, consultez Chemin d'élément DSQL.

  4. Cliquez sur l'élément de sortie items et ajoutez les lignes suivantes sous l'expression existante :
    JOIN salespersons ON id = salesperson_id

    Cette clause JOIN est nécessaire pour mapper plusstore.salespersons.name à plusstoreitems.items.salesperson_name, car l'élément d'entrée n'est pas dans le contexte d'itération courant. Cette clause modifie le contexte de boucle et si vous cliquez sur la sortie item_name, vous pouvez voir que l'expression n'est plus un chemin relatif, elle a été remplacée par un chemin absolu.

  5. Glissez-déposez plusstore.salespersons.name sur plusstoreitems.items.salesperson_name.
    Puisque le contexte d'itération est à présent la boucle d'entrée salespersons, l'expression dans salesperson_name est le chemin relatif name.

Résultats

Votre map est configurée. Vous pouvez utiliser la fonction Test Run (Exécution de test) pour consulter les résultats. Dans cet exemple, le résultat suivant est retourné :
{
   "items":[
      {
         "store_name":"plusstore",
         "store_location":"saint louis",
         "department_name":"sports",
         "salesperson_id":"25",
         "salesperson_name":"Antonio Guttierez",
         "item_name":"MBIKE"
      },
      {
         "store_name":"plusstore",
         "store_location":"saint louis",
         "department_name":"sports",
         "salesperson_id":"25",
         "salesperson_name":"Antonio Guttierez",
         "item_name":"ESCOOT"
      },
      {
         "store_name":"plusstore",
         "store_location":"saint louis",
         "department_name":"electronics",
         "salesperson_id":"32",
         "salesperson_name":"Gina Monsanto",
         "item_name":"Portable SSD T5"
      },
      {
         "store_name":"plusstore",
         "store_location":"saint louis",
         "department_name":"electronics",
         "salesperson_id":"32",
         "salesperson_name":"Gina Monsanto",
         "item_name":"Extreme Portable SSD"
      }
   ]
}
Vous pouvez également consulter la vue DSQL Script (Script DSQL) pour voir à quoi ressemble le script complet. Vous pouvez voir que certains éléments utilisent des chemins relatifs et d'autres des chemins absolus :
FROM plusstore
SELECT {
   items = (
      FROM plusstore.departments
      UNNEST items
      JOIN salespersons ON id = salesperson_id
      SELECT {
         store_name = plusstore.name,
         store_location = location,
         department_name = plusstore.departments.name,
         salesperson_id = salesperson_id,
         salesperson_name = name,
         item_name = plusstore.departments.items.name
      }
   )
}

Cette page vous a-t-elle aidé ?

Si vous rencontrez des problèmes sur cette page ou dans son contenu – une faute de frappe, une étape manquante ou une erreur technique – dites-nous comment nous améliorer !