La clause UNNEST
est utilisée pour désimbriquer une collection imbriquée et effectuer une jointure entre elle et sa collection parente.
Le mot-clé
UNNEST
doit être suivi de l'identifiant de la collection imbriquée. Il doit être un enfant de la collection imbriquante spécifiée dans la clause FROM
ou UNNEST
:FROM parent_identifier UNNEST child_identifier
Vous pouvez utiliser les mots-clés AS
et INDEX
dans la clause UNNEST
. Vous pouvez également avoir plusieurs clauses UNNEST
consécutives.
Lors de l'utilisation d'une ou de plusieurs clause·s UNNEST
sans alias, tous les identifiants utilisés dans la requête sans chemin absolu sont traités comme étant relatifs à l'identifiant dans la dernière clause UNNEST
ou à sa clause parente si un identifiant dans la requête ne fait pas partie de la dernière clause.
Par exemple, avec les données d'entrée suivantes :
{
"customers":[
{
"name":"John Smith",
"orders":[
{
"id":"abc-12345",
"items":[
{
"id":"97516848-jiargn",
"quantity":2
}
]
}
]
},
{
"name":"Jane Doe",
"orders":[
{
"id":"def-12345",
"items":[
{
"id":"97516848-kftesn",
"quantity":3
},
{
"id":"96946848-metasb",
"quantity":1
}
]
}
]
}
]
}
Vous pouvez utiliser deux clauses
UNNEST
pour obtenir les données dans les collections customers
, orders
et items
au même niveau :FROM customers UNNEST orders AS o UNNEST items AS i
SELECT {
customer_name = name,
order_id = o.id,
item_id = i.id,
item_quantity = quantity
}
Comme les identifiants
name
et quantity
sont uniques, ils ne doivent pas contenir de préfixe avec l'alias de connexion. Cependant, comme les deux collections orders
et items
contiennent un élément id
, vous devez utiliser l'alias pour spécifier laquelle doit être retournée. Cette requête retourne le résultat suivant :[
{
"customer_name":"John Smith",
"order_id":"abc-12345",
"item_id":"97516848-jiargn",
"item_quantity":2
},
{
"customer_name":"Jane Doe",
"order_id":"def-12345",
"item_id":"97516848-kftesn",
"item_quantity":3
},
{
"customer_name":"Jane Doe",
"order_id":"def-12345",
"item_id":"96946848-metasb",
"item_quantity":1
}
]