Description
Renvoie un échantillon non déterministe à partir des résultats de l'étape précédente.
Deux modes sont compatibles :
documents: sélectionnendocuments de manière aléatoire.percent: sélectionnen% des documents de manière aléatoire.
Exemples
Web
let results; // Get a sample of 100 documents in a database results = await execute(db.pipeline() .database() .sample(100) ); // Randomly shuffle a list of 3 documents results = await execute(db.pipeline() .documents([ doc(db, "cities", "SF"), doc(db, "cities", "NY"), doc(db, "cities", "DC"), ]) .sample(3) );
Swift
var results: Pipeline.Snapshot // Get a sample of 100 documents in a database results = try await db.pipeline() .database() .sample(count: 100) .execute() // Randomly shuffle a list of 3 documents results = try await db.pipeline() .documents([ db.collection("cities").document("SF"), db.collection("cities").document("NY"), db.collection("cities").document("DC"), ]) .sample(count: 3) .execute()
Kotlin
var results: Task<Pipeline.Snapshot> // Get a sample of 100 documents in a database results = db.pipeline() .database() .sample(100) .execute() // Randomly shuffle a list of 3 documents results = db.pipeline() .documents( db.collection("cities").document("SF"), db.collection("cities").document("NY"), db.collection("cities").document("DC") ) .sample(3) .execute()
Java
Task<Pipeline.Snapshot> results; // Get a sample of 100 documents in a database results = db.pipeline() .database() .sample(100) .execute(); // Randomly shuffle a list of 3 documents results = db.pipeline() .documents( db.collection("cities").document("SF"), db.collection("cities").document("NY"), db.collection("cities").document("DC") ) .sample(3) .execute();
Python
# Get a sample of 100 documents in a database results = client.pipeline().database().sample(100).execute() # Randomly shuffle a list of 3 documents results = ( client.pipeline() .documents( client.collection("cities").document("SF"), client.collection("cities").document("NY"), client.collection("cities").document("DC"), ) .sample(3) .execute() )
Java
// Get a sample of 100 documents in a database Pipeline.Snapshot results1 = firestore.pipeline().database().sample(100).execute().get(); // Randomly shuffle a list of 3 documents Pipeline.Snapshot results2 = firestore .pipeline() .documents( firestore.collection("cities").document("SF"), firestore.collection("cities").document("NY"), firestore.collection("cities").document("DC")) .sample(3) .execute() .get();
Go
// Get a sample of 100 documents in a database results1, err := client.Pipeline().Database().Sample(firestore.WithDocLimit(100)).Execute(ctx).Results().GetAll() if err != nil { fmt.Fprintf(w, "GetAll failed: %v", err) return err } // Randomly shuffle a list of 3 documents results2, err := client.Pipeline(). Documents([]*firestore.DocumentRef{ client.Collection("cities").Doc("SF"), client.Collection("cities").Doc("NY"), client.Collection("cities").Doc("DC"), }). Sample(firestore.WithDocLimit(3)). Execute(ctx).Results().GetAll() if err != nil { fmt.Fprintf(w, "GetAll failed: %v", err) return err }
Modes
Mode Documents
Le mode documents sélectionne jusqu'à n documents de manière aléatoire à partir de son entrée, où
chaque document (ainsi que l'ordre des documents) a la même probabilité d'être
choisi. Pour ce faire, Cloud Firestore doit toujours analyser et
traiter tous les documents. Cette opération peut donc s'avérer coûteuse.
Par exemple, pour la collection suivante :
Node.js
await db.collection("cities").doc("SF").set({name: "San Francsico", state: "California"});
await db.collection("cities").doc("NYC").set({name: "New York City", state: "New York"});
await db.collection("cities").doc("CHI").set({name: "Chicago", state: "Illinois"});
L'étape d'échantillonnage en mode Documents peut être utilisée pour récupérer un sous-ensemble non déterministe de résultats de cette collection.
Node.js
const sampled = await db.pipeline()
.collection("/cities")
.sample(1)
.execute();
Dans cet exemple, un seul document est renvoyé de manière aléatoire.
{ name: "New York City", state: "New York" }
Si le nombre fourni est supérieur au nombre total de documents renvoyés, tous les documents sont renvoyés dans un ordre aléatoire.
Node.js
const sampled = await db.pipeline()
.collection("/cities")
.sample(5)
.execute();
Les documents suivants sont alors renvoyés :
{ name: "New York City", state: "New York" }
{ name: "Chicago", state: "Illinois" }
{ name: "San Francisco", state: "California" }
Mode Pourcentage
Le percent mode tente de sélectionner n % de tous les documents à partir de son entrée.
L'étape génère alors environ # documents * percent / 100 documents. Comme en documents mode, Cloud Firestore s'assure que
chaque document a la même probabilité d'être renvoyé. Pour ce faire,
Cloud Firestore doit analyser et traiter tous les documents. Cette opération peut
donc s'avérer coûteuse, même lorsque l'ensemble de résultats est petit.
Contrairement au mode documents, l'ordre n'est pas aléatoire et conserve l'ordre des documents préexistant. Cette entrée de pourcentage doit être une valeur double comprise entre 0.0 et 1.0.
Par exemple, pour la collection suivante :
Node.js
await db.collection("cities").doc("SF").set({name: "San Francsico", state: "California"});
await db.collection("cities").doc("NYC").set({name: "New York City", state: "New York"});
await db.collection("cities").doc("CHI").set({name: "Chicago", state: "Illinois"});
await db.collection("cities").doc("ATL").set({name: "Atlanta", state: "Georgia"});
L'étape d'échantillonnage en mode Pourcentage peut être utilisée pour récupérer (en moyenne) 50% des
documents de l'collection(...) étape.
Node.js
const sampled = await db.pipeline()
.collection("/cities")
.sample({ percent: 0.5 })
.execute();
Un échantillon non déterministe de (en moyenne) 50% des documents de la collection cities est alors renvoyé. Voici un résultat possible.
{ name: "New York City", state: "New York" }
{ name: "Chicago", state: "Illinois" }
En mode Pourcentage, comme chaque document a la même probabilité d'être sélectionné, il est possible qu'aucun document ou que tous les documents soient renvoyés.
Exemples de clients
Web
// Get a sample of on average 50% of the documents in the database const results = await execute(db.pipeline() .database() .sample({ percentage: 0.5 }) );
Swift
// Get a sample of on average 50% of the documents in the database let results = try await db.pipeline() .database() .sample(percentage: 0.5) .execute()
Kotlin
// Get a sample of on average 50% of the documents in the database val results = db.pipeline() .database() .sample(SampleStage.withPercentage(0.5)) .execute()
Java
// Get a sample of on average 50% of the documents in the database Task<Pipeline.Snapshot> results = db.pipeline() .database() .sample(SampleStage.withPercentage(0.5)) .execute();
Python
from google.cloud.firestore_v1.pipeline_stages import SampleOptions # Get a sample of on average 50% of the documents in the database results = ( client.pipeline().database().sample(SampleOptions.percentage(0.5)).execute() )
Java
// Get a sample of on average 50% of the documents in the database Pipeline.Snapshot results = firestore.pipeline().database().sample(Sample.withPercentage(0.5)).execute().get();
Go
// Get a sample of on average 50% of the documents in the database snapshot := client.Pipeline(). Database(). Sample(firestore.WithPercentage(0.5)). Execute(ctx)