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();
Accéder
snapshot := client.Pipeline(). Collection("books"). Sort(firestore.Orders( firestore.Descending(firestore.FieldOf("release_date")), firestore.Ascending(firestore.FieldOf("author")), )). Execute(ctx)
Comportement
Ordre de tri
L'ordre de tri suit l'ordre du type de valeur 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 n'est pas 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 d'une exécution à l'autre.
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 produire n'importe quelle permutation des trois documents de l'ensemble de données, car ils ont tous le même attribut country. Pour produire 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 sera utilisé comme critère 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 les 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, trier 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 produire n'importe quelle permutation des deux documents de l'ensemble de données, car les deux documents ont la même valeur size : 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 ce comportement diffère de celui 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, trier 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 comme 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 }