仅从firestore导出原始数据



我愿意将我以前和将来所有的firestore文档以表格格式导出到Big Query。

示例:如果我在firestore中有一个User集合,如:

{
"name": "Jon",
"score": 10,
}

那么BigQuery表应该是这样的:

-------------------------------------
|       id       |   name   |  score  |
----------------+----------+---------
| <document_id>  |   Jon    |    10   |
----------------+----------+---------

我试过使用

  1. 导出集合到BigQuery。这不会导出上述格式的数据;而是跟踪每个插入/更新/删除事件。
  2. 手动在数据集中创建表并从firestore导入备份。这确实得到了我想要的BigQuery表视图,但它不会自动更新(像扩展一样)。

我怎么做才能实现上面提到的表格格式的文档,并在firestore文档更新时自动更新?我是否必须编写自己的云函数来将所有数据更新到BigQuery?

随"Export Collections to bigquery"而来的模式视图脚本允许您创建视图,使您能够像建议的那样以更表格的形式查询数据。你可以设置它们一次,然后对它们进行查询,即使有新的数据进来。

  1. 导出集合到BigQuery。控件中的数据不会导出以上格式;而是跟踪每个插入/更新/删除操作事件。

正如Michael所解释的,使用"Export Collections to bigquery";您可以运行扩展提供的schema-views脚本,根据所需的数据模型创建视图。


另一种方法是编写一个直接写入BigQuery的云函数。下面的简单示例展示了一个Scheduled Cloud Function如何从users集合中读取文档并将它们添加到BigQuery表中。

适应它取决于你。特别是,如果你想在创建/删除/更新Firestore文档时更新BigQuery表,你应该使用onWrite()Cloud Function。

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const { BigQuery } = require('@google-cloud/bigquery');
const bigquery = new BigQuery();

exports.exportToBigQuery = functions.pubsub.schedule('every 24 hours').onRun(async (context) => {
try {
// get the user docs !! UP TO YOU TO ADAPT THE QUERY !!
const usersQuerySnapshot = await admin.firestore().collection("users").get();
const rows = [];
usersQuerySnapshot.forEach((doc) => {
rows.push({ id: doc.id, name: doc.get("name"), score: doc.get("score") })
});
const dataset = bigquery.dataset("dataset-name"); // Use Environment configuration https://firebase.google.com/docs/functions/config-env
const table = dataset.table("table-name");
await table.insert(rows);

return null;
} catch (error) {
console.log(error);
return null;
}
});

相关内容

  • 没有找到相关文章

最新更新