FIrestoreからStorageにエクスポートする
const functions = require('firebase-functions');
const firestore = require('@google-cloud/firestore');
const client = new firestore.v1.FirestoreAdminClient();

// Replace BUCKET_NAME
const bucket = 'gs://****';

exports.scheduledFirestoreExport = functions.pubsub
                                            .schedule('every 24 hours')
                                            .onRun((context) => {

  const projectId = process.env.GCP_PROJECT || process.env.GCLOUD_PROJECT;
  const databaseName =
    client.databasePath(projectId, '(default)');

  return client.exportDocuments({
    name: databaseName,
    outputUriPrefix: bucket,
    // Leave collectionIds empty to export all collections
    // or set to a list of collection IDs to export,
    collectionIds: [{collection id1},{sub collection id of id1},{sub collection id of id1},{collection id2}']//works fine
    })
  .then(responses => {
    const response = responses[0];
    console.log(`Operation Name: ${response['name']}`);
  })
  .catch(err => {
    console.error(err);
    throw new Error('Export operation failed');
  });
});
collectionIdsの指定でかなり迷ったが,最も上の階層にあるコレクションIDとその下の階層にあるコレクションIDを同列で書くらしい.上の階層のコレクションIDを指定せずに下の階層のIDだけ指定すると何も出力されない collectionIdsを指定しなくてもエクスポートはできるものの,その場合,StorageからBigQueryに読み込めなくなるので今回は指定することが必須. https://cloud.google.com/bigquery/docs/loading-data-cloud-firestore?hl=ja

StorageからBigQueryへの読み込み

aaa

import os
from google.cloud import bigquery
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = './credential.json'
# TODO(developer): Set table_id to the ID of the table to create.

table_id = "[project id].[db of bq].[table id]"

# TODO(developer): Set uri to the path of the kind export metadata
uri = (
    "gs://****-backup-all/2021-09-09T11:50:09_53192/all_namespaces/kind_***/all_namespaces_kind_****.export_metadata"
)

# TODO(developer): Set projection_fields to a list of document properties
#                  to import. Leave unset or set to `None` for all fields.
projection_fields = []

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

job_config = bigquery.LoadJobConfig(
    source_format=bigquery.SourceFormat.DATASTORE_BACKUP,
    projection_fields=projection_fields,
    write_disposition='WRITE_TRUNCATE'
)
'''
WRITE_TRUNCATE: If the table already exists, BigQuery overwrites the table data and uses the schema from the load.
WRITE_APPEND: If the table already exists, BigQuery appends the data to the table.
WRITE_EMPTY: If the table already exists and contains data, a 'duplicate' error is returned in the job result.
'''

load_job = client.load_table_from_uri(
    uri, table_id, job_config=job_config
)  # Make an API request.

load_job.result()  # Waits for the job to complete.

destination_table = client.get_table(table_id)
print("Loaded {} rows.".format(destination_table.num_rows))
a u 上書きするかどうかはjob_config = bigquery.LoadJobConfigの部分でwrite_disposition引数で指定する. WRITE_TRUNCATE: If the table already exists, BigQuery overwrites the table data and uses the schema from the load. WRITE_APPEND: If the table already exists, BigQuery appends the data to the table. WRITE_EMPTY: If the table already exists and contains data, a ‘duplicate’ error is returned in the job result. projection_fieldsでエクスポートするFIeldを指定できる. a ‘ ‘