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

Posted

技术标签:

【中文标题】如何使用云功能从 Firestore 中删除数据【英文标题】:How to delete data from Firestore with cloud functions 【发布时间】:2018-04-23 05:33:11 【问题描述】:

我正在结合谷歌的 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();

);

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

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

【问题讨论】:

【参考方案1】:

可以使用以下代码递归删除集合中的所有文档。 这段代码非常适合我。 确保您已安装 JSON 文件的 firebase credentialsfirebase-admin

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);
    );
    

【讨论】:

【参考方案2】:

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

节点js中要删除的代码:

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

【讨论】:

如果这是一个糟糕的解决方案,有人可以指出一个更好的解决方案吗?

以上是关于如何使用云功能从 Firestore 中删除数据的主要内容,如果未能解决你的问题,请参考以下文章

Firestore - 云功能 - 获取删除文档的用户的 uid

Firestore + 云功能:如何从另一个文档中读取

如何从云功能中移动 Firestore 文档?

如何使用云函数将数据写入云 Firestore

云功能/Firestore。当字段位于不同文档中时如何触发

如何从 Firestore 云数据库中读取文档中的 ArrayLists?