首页 > 解决方案 > 如何定位谷歌实时数据库中深度嵌套的对象?

问题描述

我想做一个 cron 作业,删除我的实时数据库中超过 24 小时的深层嵌套对象。

我已经遍历并到达了深层嵌套的对象,但我无法在对象中获取/定位“addTime”的值。如何获取该值以便可以.remove在父级上运行?到目前为止,它返回为未定义或抛出错误。

  .schedule("every 1 hours")
  .onRun(context => {
    const rootDatabaseRef = admin.database().ref("ghostData/");
    return rootDatabaseRef.ref.once("value").then(function(snapshot) {
      console.log("snap", snapshot.val());
      snapshot.forEach(function(userSnapshot) {
        let buckets = userSnapshot.val().buckets;
        console.log("buckets", buckets);
        buckets.forEach(function(bucket) {
          let currentTimeYesterday = new Date(
            new Date().getTime() - 24 * 60 * 60 * 1000
          ).getTime();
          let addedTime = bucket.val().addedTime;
          console.log("curr time", currentTimeYesterday);
          console.log("addedTime", addedTime);
        });
      });

这是我的实时数据库中的数据以及来自无服务器云功能的日志:

数据结构 日志1 日志2

标签: javascriptfirebase-realtime-databasegoogle-cloud-platformgoogle-cloud-functions

解决方案


我认为您在循环时遇到问题,因为当您执行此操作时, "buckets.forEach(function(bucket)" --> bucket 在您的情况下是 list 的第一个元素,并且每个元素都有一个嵌套 dictionary ,所以首先您必须迭代字典,并且对于字典中的每个键,您将获得另一个字典,并且您必须仅获取附加时间值。

我知道这很难理解,但我认为它正在发生,因为你没有正确循环。

试试下面的代码或类似的代码。

buckets.forEach(function(bucket){
   let currentTimeYesterday = new ......
   bucket.forEach(function(dict){
       Object.keys(dict).forEach(k => {
           console.log(k, ':', dict[k].addedTime);
           let addedTime = dict[k].addedTime;

       });
    ....
   }
  ....
}

推荐阅读