Как сравнить два документа? (Firestore onUpdate) - PullRequest
0 голосов
/ 09 июля 2020

Итак, я хочу использовать триггер onUpdate в документе, чтобы увидеть разницу между до и после.

Вот как это выглядело раньше: enter image description here

and after: enter image description here

So in the example, the difference between the documents is "zfb5gXV54f5jbfn438Hd". With that, I'll use it else where in my app.

Here's what I have so far:

export const someFunc = functions.firestore.document('invites/{invitesUID}').onUpdate(async (change, context) => { 
    const previousValue = change.before.data();
    const newValue = change.after.data();
    })

So with onUpdate I'll be able to get the information that I need. What approach should I take for this? I have some ideas but wanted to know if there was a better way to do it. As always, I appreciate any help!

UPDATE:

So I came up with this:

export const deleteMember = functions.firestore.document('invites/{invitesUID}').onUpdate(async (change, context) => {
    const previousValue = change.before.data()['invites']
    const newValue = change.after.data()['invites']
    if (previousValue.length > newValue.length) {
        
        const prevInviteListArray = Object.entries(previousValue)
        const newInviteListArray = Object.entries(newValue)
        let difference = prevInviteListArray.filter((x: any) => !newInviteListArray.includes(x));

        console.log('old list: ' + prevInviteListArray)
        console.log('new list: ' + newInviteListArray)
        console.log('the difference: ' + difference)
    }
})

and got this result: введите описание изображения здесь

Не уверен, почему фильтр не работал ... есть идеи? (Также как я могу увидеть, что находится в объекте?)

1 Ответ

0 голосов
/ 09 июля 2020

Вы уже на правильном пути, триггер onUpdate предоставит документ как до, так и после изменения. Оттуда, как вы решите сравнить оба объекта, чтобы узнать, какие изменения произошли, полностью зависит от вас. Если вы ищете примеры, вы можете проверить документацию

Код event.before.data() возвращает своего рода Javascript Hashmap, к которому вы можете получить доступ, как обычно, и то же самое применимо к полям массива внутри документа Firestore, для вас они просто JS массивы. Я заставил код работать следующим образом:

export const deleteMember = functions.firestore.document('invites/{invitesUID}').onUpdate(async (change, context) => {
    const previousValue = change.before.data()['invites']
    const newValue = change.after.data()['invites']
    if (previousValue.length > newValue.length) {
        let difference = previousValue.filter(x => !newValue.includes(x));
        console.log('old list: ' + previousValue)
        console.log('new list: ' + newValue)
        console.log('the difference: ' + difference)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...