我想定期将Firestore数据自动导出到Google Cloud Storage(以便随后将其导入BigQuery进行分析)。
Schedule data exports确实概述了按计划从Firestore导出数据的方法,但是它是在Node.js上运行的JavaScript:我想避免这种情况,并且宁愿坚持使用全Java解决方案。
Export and import data提供了另一种方式-使用gcloud
命令行实用程序-将Firestore数据导出到GCS。但是,我不想安排脚本在笔记本电脑上运行,而是必须确保在正确的时间 打开笔记本电脑,并且该笔记本电脑具有有效的Internet连接。我正在寻找完全基于App Engine(标准)的解决方案,可以作为cron
作业运行。
在撰写本文时,似乎还没有使用Java的Firebase Admin SDK(版本6.6.0)进行编程的方式。
答案 0 :(得分:1)
答案在于直接利用Firestore REST API。
在下面的代码中,我使用了Google的HTTP Client Library for Java(无论如何,它都是App Engine(标准)上的默认选择)进行必要的网络调用。
public static final String DEF_GCS_BUCKET_NAME = PROJECT_ID + ".appspot.com";
public static final String FIRESTORE_API_V1BETA2 =
"https://firestore.googleapis.com/v1beta2";
public static final String FIRESTORE_DB = "/projects/" + PROJECT_ID
+ "/databases/(default)";
public static final String FIRESTORE_EXPORT_GCS_LOC = "gs://"
+ DEF_GCS_BUCKET_NAME + "/firestore-export/";
public static final String FIRESTORE_EXPORT_GCS_ROOT = "firestore-export/";
private static final String FUNC_EXPORT_DOCUMENTS = ":exportDocuments";
@javax.annotation.CheckForNull
public static Operation exportCollectionToGcs(@lombok.NonNull String collection)
throws IOException {
AccessToken token = tokenFor(serviceAc());
Map<String, Object> payload = new HashMap<>();
payload.put("collectionIds", Arrays.asList(collection));
payload.put("outputUriPrefix", FIRESTORE_EXPORT_GCS_LOC + collection);
GenericUrl url = new GenericUrl(FIRESTORE_API_V1BETA2 + FIRESTORE_DATABASE
+ FUNC_EXPORT_DOCUMENTS);
HttpContent content = new JsonHttpContent(jacksonFactory(), payload);
HttpRequest req = requestFactory().buildPostRequest(url, content);
req.getHeaders().setAuthorization("Bearer " + token.getTokenValue())
Operation op = null;
try {
HttpResponse res = req.execute();
// Parse the response JSON to populate an Operation POJO
} catch (HttpResponseException e) {
// Handle the error
}
return op;
}
这将启动Firestore Operation,以将指定的集合导出到GCS。然后,get the status of the Operation如果您想在完成时做点什么(或只是发送/准备报告)。
确保您使用的服务帐户具有必要的权限(如Schedule data exports中所述)。