【问题标题】:Firebase cloud function to loop through array and delete linked Data?Firebase云函数循环遍历数组并删除链接数据?
【发布时间】:2018-06-27 20:16:57
【问题描述】:

目前,我有两个与 Firebase、对话和帖子相关的孩子。

  {
  "conversations" : {
    "-LFzccEzciNPSTFAZAhb" : {
      "49C91D37EE1C4B3E07FE24FEBE9ED72B" : "true",
      "CAD54A563CAB99107D9BBDB7F2234FA3" : "true",
      "Date" : "2018-06-27 05:06:12 +0000",
      "convoID" : "-LFzccEzciNPSTFAZAhb",
      "created_at" : 1.5300759725991712E9,
      "last_message" : "lesseee",
      "last_message_time" : 1530077715525,
      "postID" : "-LFzT4c6ylIcPne9F7QS",
      "status" : "sent",
      "timeOfDeletion" : 1530159609351
    },
    "-LFzd4rx4hCKtdls2yyF" : {
      "49C91D37EE1C4B3E07FE24FEBE9ED72B" : "true",
      "CAD54A563CAB99107D9BBDB7F2234FA3" : "true",
      "Date" : "2018-06-27 05:08:13 +0000",
      "convoID" : "-LFzd4rx4hCKtdls2yyF",
      "created_at" : 1.530076093932972E9,
      "last_message" : "feeling terrible",
      "last_message_time" : 1530077516414,
      "postID" : "-LFzd-uN4kRfU18TBj0N",
      "status" : "sent",
      "timeOfDeletion" : 1530162473644
    }
  },

和帖子:

 "posts" : {
"-LFzT4c6ylIcPne9F7QS" : {
  "Revealed" : "false",
  "datePosted" : "2018-06-27 04:20:09 +0000",
  "post" : "Hey boys",
  "poster" : "49C91D37EE1C4B3E07FE24FEBE9ED72B",
  "revealedDate" : 1530073209351,
  "reveals" : 1,
  "revealsRequired" : 13,
  "timeOfDeletion" : 1530159609351,
  "watchedBy" : {
    "3ASP4M5mkTPGPO1qQhfVKXsr6Qf2" : "false",
    "AGdUYuWFJ9dC4VcPKeQJoMOM1xe2" : "false",
    "Hsm2R97Y1VZbhXHNrRvHuTKSrYv1" : "false",
    "Ih5m9VUnJnewKvqiZCVgBFwCFrz1" : "false",
    "N0IjBvmj9ieAKoBGpSJIitN6xmI3" : "false",
    "NMo1gUPKWFcdhsrnCbKte7JfrcA2" : "false",
    "NuAF78saM4OiaSlIVTtLD4gHWnp1" : "false",
    "OclP0yKT9ig6TtifF2ik1yh2TRr2" : "false",
    "XyF2qaRasbfNfwo6KM6ZClrsud42" : "false",
    "bc7gjBues0XWimaq3AKiLYRKJzc2" : "false",
    "dlwFYqlu2mgetB5zO6TNmFGBWcb2" : "false",
    "h42bS6QbVEdUkNJv2yjrU7L09HX2" : "-LFzccEzciNPSTFAZAhb",
    "i0U1oShLCWRVPezSzfUQl7VmwFB2" : "false",
    "kAfSAHHUWNcCKRjR28EtuXclWmE3" : "false",
    "mSWA8kF4XUMsK3fXDqx7iIBBJcb2" : "false",
    "qNWbYTlfYvXOIhNNjFkvrgjXCOk1" : "false",
    "yuUJHFcihgej6BFtCjXhL8cgLMC2" : "false"
  }
},

每分钟,都会在数据库上运行一个 cron 作业来删除旧帖子:

 exports.hourly_job =
  functions.pubsub.topic('hourly-tick').onPublish((event) => {
  const currentTime = Date.now()
  const getPostsForDate = admin.database().ref('posts').orderByChild('timeOfDeletion').endAt(currentTime); 

  return getPostsForDate.once('value', (snapshot) => {
        var updates = {};
        snapshot.forEach((childSnapshot) => {

            const postDetails = childSnapshot.val();
            const postIDtoDelete = childSnapshot.key

            updates[postIDtoDelete] = null

                })
            admin.database().ref('posts').update(updates)
        })
      });

在数据库中,如果用户与帖子开始对话,帖子子项中的watchedBy值将从“false”更改为对话的ID。每分钟,cron 作业都会运行以删除旧帖子;但是,对话也需要删除。为了尽量减少数据下载使用量,我将对话 ID 与 watchBy 节点相关联。现在,当一个孩子被删除时,我如何遍历 watchBy 孩子中的每个用户,查看该值是否不是“false”,如果是,则删除具有该 ID 的对话?我需要这样做无需下载更多信息,只需访问子快照中的数据。我也在尝试尽量减少数据下载的使用,那么这种设计是否可行且高效?

旧代码(在我尝试最小化数据下载使用之前)

exports.hourly_job =
  functions.pubsub.topic('hourly-tick').onPublish((event) => {
  const getPostsForDate = admin.database().ref('posts').on('value', (snapshot) => {
    const currentTime = Date.now()
        snapshot.forEach((childSnapshot) => {

            const postDetails = childSnapshot.val();

                const timeOfPostDeletion = postDetails.timeOfDeletion

                if (currentTime > timeOfPostDeletion) {

                     const postIDtoDelete = childSnapshot.key

                     const postDelete = admin.database().ref('/posts/'+ postIDtoDelete).remove()

                     const conversationsToRemove = admin.database().ref('/convoPosts/' + postIDtoDelete).on('value', (snapshot) => {
                            snapshot.forEach((childSnapshot) => {
                                const convoKey = childSnapshot.key
                                conversationReferenceDeletion = admin.database().ref('/conversations/' + convoKey).remove()
                            })
                     })



                }

        })

  })
    return true
  });

编辑:尝试迭代。

<!-- language: node.js -->


 const peopleWatching = postDetails.child('watchedBy').val()

            updates[postIDtoDelete] = null
            for (child in people) {
                let value = child.val();
                if (value !== "false") {
                    convoUpdates[value] = null
                }
            }

【问题讨论】:

    标签: firebase firebase-realtime-database google-cloud-functions


    【解决方案1】:

    请试试这个:

    return admin.database().ref(`/watchedBy`).once('value').then(snap => {
      if (snap.hasChildren()) {
        const updates = {};
        snap.forEach(child => {
          if(child.val() !== "false"){
            updates[child.key] = null;
          }
        });
        return p.update(updates);
      }else{
        return null;
      }
    });
    

    【讨论】:

    • 这将如何检查watchedBy 值是否具有会话ID 并且不只是错误的?看起来你写的东西正在实现我已经拥有的东西。
    • 是否有必要用 .value 做另一个引用?我不能只检查包含整个快照的 postDetails 吗?
    • 那我觉得你应该用child.child('watchedBy').val() !== "false"
    • 如果我得到了被监视的孩子,那将返回每个可能返回可变数量的人的用户。是否可以遍历每个人?对于watchesBy child 中的每个值还是...?
    • 我在答案中的编辑会遍历所有内容吗?
    猜你喜欢
    • 2010-09-23
    • 2011-11-30
    • 2017-07-16
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 2017-08-16
    相关资源
    最近更新 更多