Description
Trie les documents d'entrée en fonction d'un ou de plusieurs ordres de tri spécifiés.
Exemples
Web
const results = await execute(db.pipeline() .collection("books") .sort( field("release_date").descending(), field("author").ascending() ) );
Swift
let results = try await db.pipeline() .collection("books") .sort([ Field("release_date").descending(), Field("author").ascending() ]) .execute()
Kotlin
val results = db.pipeline() .collection("books") .sort( field("release_date").descending(), field("author").ascending() ) .execute()
Java
Task<Pipeline.Snapshot> results = db.pipeline() .collection("books") .sort( field("release_date").descending(), field("author").ascending() ) .execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import Field results = ( client.pipeline() .collection("books") .sort(Field.of("release_date").descending(), Field.of("author").ascending()) .execute() )
Java
Pipeline.Snapshot results = firestore .pipeline() .collection("books") .sort(descending(field("release_date")), ascending(field("author"))) .execute() .get();
Comportement
Ordre de tri
L'ordre de tri suit l'ordre des types de valeurs de Cloud Firestore.
Ordre déterministe des résultats
S'il n'y a pas d'étape sort dans la requête, l'ordre des résultats renvoyés est non déterministe et peut varier d'une exécution à l'autre. Si une étape sort est présente, mais que les expressions de tri ne parviennent pas à produire un tri unique parmi les résultats renvoyés, l'ordre des résultats renvoyés peut toujours varier entre les exécutions.
Par exemple, triez les villes par country, dans l'ordre croissant, par rapport à l'ensemble de données suivant :
{ name: "Los Angeles", state: "CA", country: "USA", population: 3970000 },
{ name: "New York", state: "NY", country: "USA", population: 8530000 }
{ name: "San Francisco", state: "CA", country: "USA", population: 870000 },
peut générer n'importe quelle permutation des trois documents de l'ensemble de données, car ils ont tous le même attribut country. Pour obtenir un ordre déterministe des résultats, vous pouvez ajouter un ordre de tri sur name à la commande :
Node.js
const results = await db.pipeline()
.collection("/cities")
.sort(field("country").ascending(), fieldd("__name__").ascending())
.execute();
Le nom unique du document servira de départage lorsque plusieurs documents auront la même valeur country. Notez que tous les autres champs qui, avec le champ country, forment une clé unique du document dans la collection peuvent être utilisés pour produire un ordre déterministe des résultats.
Trier des valeurs équivalentes
Les valeurs équivalentes sont triées ensemble, mais l'ordre des résultats au sein de la classe équivalente n'est pas déterministe, comme indiqué dans la section Ordre déterministe des résultats. Par exemple, triez les villes par size, dans l'ordre croissant, par rapport à l'ensemble de données suivant :
{ name: "Los Angeles", state: "CA", country: "USA", size: 3970000 },
{ name: "Mexico City", state: null, country: "Mexico", size: 3970000.0 },
peut générer n'importe quelle permutation des deux documents de l'ensemble de données, car les deux documents ont la même valeur size, à savoir 3970000.
Plusieurs étapes de tri
Lorsque la requête contient plusieurs étapes de tri consécutives, seule la dernière étape de tri a un impact sur les résultats de la requête. Notez que cela diffère du comportement de la clause orderBy dans l'API Core.
Optimisation du tri Top-N
Lorsqu'un limit(...) est utilisé après un sort, un tri top N peut être utilisé. Cette optimisation limite l'utilisation de la mémoire de l'étape de tri en lui permettant de ne stocker que N documents à la fois, comme défini par limit(...), ce qui rend le tri plus économe en mémoire.
Valeurs nulles et absentes
Si un champ spécifié dans un ordre n'existe pas dans un document, sa valeur est triée comme si elle était null. Par exemple, triez les villes par state par ordre croissant par rapport à l'ensemble de données suivant :
{ name: "Los Angeles", state: "CA", country: "USA", population: 3970000 },
{ name: "Mexico City", state: null, country: "Mexico", population: 9200000 },
{ name: "New York", state: "NY", country: "USA", population: 8530000 }
{ name: "San Francisco", state: "CA", country: "USA", population: 870000 },
{ name: "Toronto", country: "Canada", population: 2930000 },
produit les résultats suivants, où le document "Toronto" et le document "Mexico" sont triés en tant que null et avant les autres documents.
{ name: "Toronto", country: "Canada", population: 2930000 },
{ name: "Mexico City", state: null, country: "Mexico", population: 9200000 },
{ name: "Los Angeles", state: "CA", country: "USA", population: 3970000 },
{ name: "San Francisco", state: "CA", country: "USA", population: 870000 },
{ name: "New York", state: "NY", country: "USA", population: 8530000 }