Campione (fase di trasformazione)
Descrizione
Restituisce un campione non deterministico dai risultati della fase precedente.
Sono supportate due modalità:
- La modalità
DOCUMENTSconsente di campionare un numero fisso di documenti- Questa modalità è simile a
GoogleSQL.RESERVOIRin quanto restituisce un campione di dimensionen, in cui qualsiasi campione di dimensionenè ugualmente possibile.
- Questa modalità è simile a
- La modalità
PERCENTconsente di campionare una percentuale di documenti- Questa modalità è simile a
GoogleSQL.BERNOULLIin quanto ogni documento viene selezionato in modo indipendente con una probabilitàpercentuguale. Di conseguenza, in media vengono restituiti#documents * percent / 100documenti.
- Questa modalità è simile a
Sintassi
Node.js
const sampled = await db.pipeline()
.database()
.sample(50)
.execute();
const sampled = await db.pipeline()
.database()
.sample({ percent: 0.5 })
.execute();
Comportamento
Modalità Documenti
La modalità Documenti recupera un numero specificato di documenti in ordine casuale.
Il numero specificato deve essere un valore INT64 non negativo.
Ad esempio, per la seguente raccolta:
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'});
La fase di campionamento in modalità documento può essere utilizzata per recuperare un sottoinsieme non deterministico di risultati da questa raccolta.
Node.js
const sampled = await db.pipeline()
.collection("/cities")
.sample(1)
.execute();
In questo esempio, verrà restituito un solo documento scelto in modo casuale.
{name: 'New York City', state: 'New York'}
Se il numero fornito è maggiore del numero totale di documenti restituiti, tutti i documenti vengono restituiti in ordine casuale.
Node.js
const sampled = await db.pipeline()
.collection("/cities")
.sample(5)
.execute();
Verranno generati i seguenti documenti:
{name: 'New York City', state: 'New York'}
{name: 'Chicago', state: 'Illinois'}
{name: 'San Francisco', state: 'California'}
Esempi di clienti
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
Android
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
Android
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();
Modalità percentuale
In modalità percentuale, ogni documento ha una probabilità specificata di percent di essere restituito. A differenza della modalità Documenti, l'ordine qui non è casuale, ma
mantiene l'ordine preesistente dei documenti. Questo input percentuale deve
essere un valore double compreso tra 0.0 e 1.0.
Poiché ogni documento viene selezionato in modo indipendente, l'output è
non deterministico e in media verranno restituiti #documents * percent / 100 documenti.
Ad esempio, per la seguente raccolta:
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'});
La fase di campionamento in modalità percentuale può essere utilizzata per recuperare (in media) il 50% dei documenti dalla fase di raccolta.
Node.js
const sampled = await db.pipeline()
.collection("/cities")
.sample({ percent: 0.5 })
.execute();
Verrà creato un campione non deterministico del 50% (in media) dei documenti
della raccolta cities. Di seguito è riportato un possibile output.
{name: 'New York City', state: 'New York'}
{name: 'Chicago', state: 'Illinois'}
In modalità percentuale, poiché ogni documento ha la stessa probabilità di essere selezionato, è possibile che non venga restituito alcun documento o che vengano restituiti tutti i documenti.
Esempi di clienti
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
Android
// 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
Android
// 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();