Firestore的Cloud Functions:访问父集合数据

Raw*_*mad 2 node.js firebase google-cloud-functions google-cloud-firestore

许多博客建议切换到Cloud Firestore,因为它很容易且安全可靠。来自实时数据库,返回使用Function + RD时,很容易浏览文档触发器,例如ref.parent

我的设置是这样的:

  • 用户数
    • {用户身份}
      • last_seen:“数据”
      • {形式}
        • {formid}

但是,我使用添加了一个文档触发器onCreate,并且我想获取以下值last_seen

exports.updateUser = functions.firestore.document('users/{userId}/forms/{formid}').onCreate((snap, context) => {

    const newValue = snap.data();
    console.log("test value : " + newValue.test); // works
    console.log("form id: " + context.params.formid); // works
    console.log("user last seen : " + newValue.last_seen); // doesn't work, can't access the parent collection data


});
Run Code Online (Sandbox Code Playgroud)

Den*_*lek 10

我完全不满意改用Firestore,但是在这种情况下几乎完全相同。

实时获得快照:

exports.doStuff = functions.database.ref('/users/{userId}/forms/{formId}')
    .onCreate((snapshot, context) => {
    const ref = snapshot.ref;
    const userRef = ref.parent.parent;
    userRef.once('value').then(parentSnap => {
        const user = parentSnap.val();
        const lastSeen = user.last_seen;
    });
});
Run Code Online (Sandbox Code Playgroud)

在Firestore中:

exports.doStuff = functions.firestore.document.onCreate('/users/{userId}/forms/{formId}')
    .onCreate((snapshot, context) => {
    const ref = snapshot.ref;
    const userRef = ref.parent.parent;
    userRef.get().then(parentSnap => {
        const user = parentSnap.data();
        const lastSeen = user.last_seen;
    });
});
Run Code Online (Sandbox Code Playgroud)

要考虑的另一件事是,您正在传递userId参数,因此您可以仅构建自己的DocumentReference(假设您还使用firebaseAdmin)

functions.firestore.document.onCreate('/users/{userId}/forms/{formId}')
    .onCreate((snapshot, context) => {
    const userId = context.params.userId;
    const userRef = firebaseAdmin.firestore().collection('users).doc(userId);
    userRef.get().then(parentSnap => {
        const user = parentSnap.data();
        const lastSeen = user.last_seen;
    });
});
Run Code Online (Sandbox Code Playgroud)

它还使您可以取消经常使用的功能的逻辑,将其视为“帮助器”方法:(注意,我偶然切换到异步/等待,这更干净了)

functions.firestore.document.onCreate('/users/{userId}/forms/{formId}')
    .onCreate(async (snapshot, context) => {
    const userId = context.params.userId;
    const lastSeen = await getLastSeen(userId);
});

// == Helper Functions ==-------------------
export async getLastSeen(userId) {
    if (!userId) return Promise.reject('no userId');
    // User Ref
    const userSnap = await firebaseAdmin.firestore().collection('users').doc(userId).get();
    return userSnap.data().last_seen;
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以getLastSeen()在需要时使用它,并且如果进行更改,则只需调整该功能即可。如果不是您经常打电话的东西,那就不用担心,但我会考虑提供getUser()帮助的...