MariaDB
 sql >> Datenbank >  >> RDS >> MariaDB

Funktionsweise des JSONPath-Wildcard-Schritts (**) in MariaDB

Wenn Sie mit JSON in MariaDB arbeiten, können Sie JSONPath-Ausdrücke verwenden, um Daten in einem JSON-Dokument zu manipulieren.

Eine leistungsstarke Funktion, die MariaDB bietet, ist der Platzhalterschritt (** ). Dadurch können Sie alle untergeordneten Elemente des aktuellen Elements rekursiv auswählen.

Der Platzhalterschritt ist eine nicht standardmäßige Erweiterung und wird mit derselben Bedeutung auch in MySQL unterstützt.

Beispiel

Hier ist ein Beispiel zur Veranschaulichung:

SET @json = '[
    { "name" : "Wag", "type" : "Dog" },
    { "name" : "Bark", "type" : "Dog" },
    { "name" : "Meow", "type" : "Cat" },
    { "name" : "Scratch", "type" : "Cat" }
]';

SELECT JSON_EXTRACT(@json, '$**.name');

Ergebnis:

+------------------------------------+
| JSON_EXTRACT(@json, '$**.name')    |
+------------------------------------+
| ["Wag", "Bark", "Meow", "Scratch"] |
+------------------------------------+

Der Wildcard-Schritt ging durch alle Objekte und wählte die Werte aus ihrem name aus Mitglieder.

In diesem Fall hätten wir mit einem anderen Selektor das gleiche Ergebnis erzielen können. Der Array-Wildcard-Selektor hätte uns dabei geholfen, das gleiche Ergebnis zu erzielen:

SET @json = '[
    { "name" : "Wag", "type" : "Dog" },
    { "name" : "Bark", "type" : "Dog" },
    { "name" : "Meow", "type" : "Cat" },
    { "name" : "Scratch", "type" : "Cat" }
]';

SELECT JSON_EXTRACT(@json, '$[*].name');

Ergebnis:

+------------------------------------+
| JSON_EXTRACT(@json, '$[*].name')   |
+------------------------------------+
| ["Wag", "Bark", "Meow", "Scratch"] |
+------------------------------------+

Gleiches Ergebnis.

Die Dinge ändern sich jedoch, wenn wir ein anderes Dokument verwenden.

Beispiel 2

Im folgenden Beispiel erhalten wir ein anderes Ergebnis zwischen dem Wildcard-Schritt und dem Array-Selektor:

SET @json = '[
    { 
        "name" : "Homer", 
        "pets" : [
            { 
            "name" : "Wag",
            "type" : "Dog"
            },
            { 
            "name" : "Scratch",
            "type" : "Cat"
            }
        ]    
    }
]';

SELECT 
    JSON_EXTRACT(@json, '$**.name'),
    JSON_EXTRACT(@json, '$[*].name');

Ergebnis:

+---------------------------------+----------------------------------+
| JSON_EXTRACT(@json, '$**.name') | JSON_EXTRACT(@json, '$[*].name') |
+---------------------------------+----------------------------------+
| ["Homer", "Wag", "Scratch"]     | ["Homer"]                        |
+---------------------------------+----------------------------------+

Unterschiedliches Ergebnis.

Die Ergebnisse hängen natürlich vom Dokument und der tatsächlichen Konstruktion des JSONPath-Ausdrucks ab, und die verwendeten Selektoren hängen von Ihren Anforderungen ab.

Beachten Sie, dass der Platzhalterschritt nicht der letzte Schritt im JSONPath-Ausdruck sein darf. Darauf muss ein Auswahlschritt für Arrays oder Objektmitglieder folgen.

Beispiel 3

Hier ist ein Beispiel, das das zweite Array-Element aus allen Arrays namens sizes zurückgibt , einschließlich Arrays, die in anderen Dokumenten verschachtelt sind:

SET @json = '[
    { 
        "_id": 1, 
        "product": { 
            "name" : "Tuxedo", 
            "color" : "Blue",
            "sizes": [ "S", "M", "L" ],
            "accessories" : {
                "belt" : {
                    "color" : "Navy",
                    "sizes" : [ "Wide", "Narrow" ]
                },
                "tie" : {
                    "color" : "Black",
                    "sizes" : [ "Short", "Medium", "Long" ]
                }
            }
        }
    }
]';

SELECT JSON_EXTRACT(@json, '$**.sizes[1]');

Ergebnis:

+-------------------------------------+
| JSON_EXTRACT(@json, '$**.sizes[1]') |
+-------------------------------------+
| ["M", "Narrow", "Medium"]           |
+-------------------------------------+

Arrays sind nullbasiert und daher $**.sizes[1] bezieht sich auf das zweite Element in allen sizes Arrays.