TL;DR;
Contourner pour l'API REST : ajoutez un filtre sans signification comme ceci orderBy="$.key"&startAt="0"
qui filtre en réalité tous les éléments avec une clé négative) : https://workaround-arrays-bagohack.firebaseio.com/matchesHeuristic.json?orderBy=%22$key%22&startAt=%220%22&print=pretty
Explication
Il s'agit d'un comportement connu et malheureux (à mon avis) de Firebase, documenté en profondeur dans leur base de connaissances de support. Citation de Bonnes pratiques : Tableaux dans Firebase :
Firebase ne prend pas en charge nativement les tableaux. Si vous stockez un tableau, il est réellement stocké en tant qu'"objet" avec des entiers comme noms de clé.
// nous envoyons ceci
['hello', 'world']
// Firebase stocke ceci
{0:'hello', 1: 'world'}
Cependant, pour aider les personnes qui stockent des tableaux dans Firebase, lorsque vous appelez .val()
ou utilisez l'API REST pour lire des données, si les données ressemblent à un tableau, Firebase les affichera comme un tableau.
En particulier, *si toutes les clés sont des entiers, et que plus de la moitié des clés entre 0 et la clé maximale de l'objet ont des valeurs non vides, alors Firebase les affichera comme un tableau. Cette dernière partie est importante à garder à l'esprit.
Vous ne pouvez actuellement pas modifier ou prévenir ce comportement. En comprenant il sera plus facile de voir ce que l'on peut et ne peut pas faire lors du stockage de données semblables à un tableau.
J'ai donc créé une petite reproduction pour vous. Données originales :
{
"matchesHeuristic": {
"1": {
"id": "foo",
"value": "bar"
},
"2": {
"id": "w",
"value": "tf"
}
},
"notMatchesHeuristic": {
"1": {
"id": "foo",
"value": "bar"
},
"365": {
"id": "w",
"value": "tf"
}
}
}
Comme retourné par Firebase REST API : https://workaround-arrays-bagohack.firebaseio.com/.json?print=pretty
{
"matchesHeuristic" : [ null, {
"id" : "foo",
"value" : "bar"
}, {
"id" : "w",
"value" : "tf"
} ],
"notMatchesHeuristic" : {
"1" : {
"id" : "foo",
"value" : "bar"
},
"365" : {
"id" : "w",
"value" : "tf"
}
}
}
comme vous pouvez le voir l'objet matchesHeuristic
est transformé en un tableau avec une valeur nulle à l'index 0 (car il correspond à l'heuristique définie dans la documentation de Firebase) alors que notMatchesHeuristic
est laissé intact. C'est particulièrement "agréable" si vous avez des données dynamiques comme nous - donc nous ne savons pas avant l'exécution si cela correspondra à l'heuristique ou non.
Contournement (API REST)
Cependant cette partie de la documentation ne semble pas tenir :
Vous ne pouvez actuellement pas modifier ou prévenir ce comportement. En comprenant il sera plus facile de voir ce que l'on peut et ne peut pas faire lors du stockage de données semblables à un tableau.
En réalité, vous pouvez contourner cela en demandant des éléments recherchés par clé, donc
{"1":{"id":"foo","value":"bar"},"2":{"id":"w","value":"tf"}}
NB: curieusement, il semble que les gars du support Firebase ne connaissent pas ce contournement (du moins ils ne l'ont pas suggéré lorsque nous leur avons demandé à propos de ce comportement).