【问题标题】:How do I monitor changes to a specific field in Firebase database?如何监控 Firebase 数据库中特定字段的更改?
【发布时间】:2018-11-29 03:08:34
【问题描述】:

我有一个存储在 Firebase 中的数据库,并希望使用“函数”来检查数据库中的记录是否存在 > n 天。我明白 onChange() JavaScript 中的函数可以为我实现这一点。谢谢!

【问题讨论】:

  • 你可以在payload中使用snapshotchanges,在文档的某个字段中调用valuechanges

标签: javascript node.js firebase firebase-realtime-database onchange


【解决方案1】:

在我的项目中,我们经常使用这种模式。使用 onChange() 检测更改,然后使用辅助函数检查更改是否发生在特定字段上。这个辅助函数例如叫做checkIfChangedHappenedToAtLeastOneOfProvidedPaths,你可以通过提供检查的路径来使用它,例如:checkIfChangedHappenedToAtLeastOneOfProvidedPaths(change.before.data(), change.after.data(), ['daysOld'])

checkIfChangedHappenedToAtLeastOneOfProvidedPaths 使用 2 个辅助函数来实现这一点(difference & getDifferenceCombine)。让我知道你的想法,这里是代码(打字稿):

checkIfChangedHappenedToAtLeastOneOfProvidedPaths

/**
 * The purpose of this function is to analyze the change between two objects.
 * If a change happened to the prvoided path(s), return true, otherwise false,
 * Usecase: Use this function if you only care about change at a certain path.
 * Example: Run only update function if change happened to "stripe" object, at groups
 * @export
 * @param {*} oldObject
 * @param {*} newObject
 * @param {string[]} pathsToCheck
 * @returns {boolean}
 */
export function checkIfChangedHappenedToAtLeastOneOfProvidedPaths(oldObject: object, newObject: object, pathsToCheck: string[]): boolean {
    const combinedChanges = getDifferenceCombine(oldObject, newObject);
    const flatObject = flat(combinedChanges);
    let changeHappened = false;
    pathsToCheck.forEach((path) => {
        const inFlatObject = flatObject[path] != null;
        const inCombinedObject = get(combinedChanges, path, null) != null;
        if (inFlatObject || inCombinedObject) {
            changeHappened = true;
        }
    });
    return changeHappened;
}

辅助函数

export function difference(object: any, base: any): any {
    return transform(object, (result, value, key) => {
        if (base == null || object == null) {
            return;
        }
        if (!isEqual(value, base[key])) {
            result[key] = isObject(value) && isObject(base[key]) ? difference(value, base[key]) : value;
        }
    });
}

export function getDifferenceCombine(oldObject: object, newObject: object): object {
    const diffObject = difference(newObject, oldObject);
    const diffObject2 = difference(oldObject, newObject);
    return {...diffObject, ...diffObject2};
}

【讨论】:

    【解决方案2】:

    由于一切都是实时更新的,如果你想监控它,你可以查询这个特定的字段。例如,假设您有一个值为 Firebase.ServerValue.TIMESTAMP 的子节点“createdAt”。

    var n = 1452508000000; //random timestamp in milliseconds, 
    //since this is how firebase saves a server value timestamp or 
    //this can be Date.now() if you convert your createdAt value 
    //to whatever date format you prefer.
    
    var ref = firebase.database().ref('path/to/your/data');
    ref.orderByChild("createdAt").startAt(n).on("child_added", function(snapshot) {
      console.log(snapshot.key);
      //will list all keys that were created on or after the timestamp value
    });
    

    https://firebase.google.com/docs/reference/js/firebase.database.Query#startAt

    【讨论】:

      猜你喜欢
      • 2022-10-04
      • 2018-09-12
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 2019-03-29
      • 2017-12-08
      相关资源
      最近更新 更多