如何使用云功能从Firestore中删除数据

时间:2017-11-10 03:16:20

标签: node.js google-cloud-platform google-cloud-firestore

我正在与google的Firestore数据库一起编写云功能。

我正在尝试编写递归删除更多数据。我找不到访问和删除数据库其他部分中的数据的语法。 我已经在下面的代码。

exports.deleteProject = functions.firestore.document('{userID}/projects/easy/{projectID}').onDelete(event => {
    // Get an object representing the document prior to deletion
    // e.g. {'name': 'Marie', 'age': 66}
    // console.log(event)
    // console.log(event.data)
    console.log(event.data.previous.data())

    var deletedValue = event.data.previous.data();

});

我在这里找到了一些信息,但我没有时间检查它,如果我发现有用的东西,我会修改这个问题。

https://firebase.google.com/docs/firestore/manage-data/delete-data?authuser=0

2 个答案:

答案 0 :(得分:1)

可以使用以下代码递归删除集合中的所有文档。
这段代码对我来说很完美。
确保已安装Firebase 凭据 firebase-admin JSON 文件。

const admin = require('firebase-admin');
const db = admin.firestore();
const serviceAccount = require('./PATH_TO_FIREBASE_CREDENTIALS.json');
admin.initializeApp({
    credential: admin.credential.cert(serviceAccount)
});

deleteCollection(db, COLLECTION_NAME, NUMBER_OF_RECORDS)
async function deleteCollection(db, collectionPath, batchSize) {
    const collectionRef = db.collection(collectionPath);
    const query = collectionRef.orderBy('__name__').limit(batchSize);

    return new Promise((resolve, reject) => {
        deleteQueryBatch(db, query, resolve).catch(reject);
    });
}

async function deleteQueryBatch(db, query, resolve) {
    const snapshot = await query.get();

    const batchSize = snapshot.size;
    if (batchSize === 0) {
        // When there are no documents left, we are done
        resolve();
        return;
    }

    // Delete documents in a batch
    const batch = db.batch();
    snapshot.docs.forEach((doc) => {
        batch.delete(doc.ref);
    });
    await batch.commit();

    // Recurse on the next process tick, to avoid
    // exploding the stack.
    process.nextTick(() => {
        deleteQueryBatch(db, query, resolve);
    });
}    

答案 1 :(得分:-3)

答案是你必须编写一个云功能,它自己删除数据并由客户端触发。客户端没有一种有效的方法。我使用的方法是在云函数中监听第一次删除,然后触发递归。

要在节点js中删除的代码:

db.collection("cities").document("DC").delete(