【问题标题】:How to delete a child node including nested child nodes in Firebase Cloud Functions?如何在 Firebase Cloud Functions 中删除包含嵌套子节点的子节点?
【发布时间】:2018-10-08 22:44:05
【问题描述】:

我正在使用 Firebase Cloud Functions 在事件过期时删除子节点,并且所有值都将被删除,但嵌套子节点除外,它不会被删除

问题是什么以及如何解决?

exports.removeOldMessages = functions.https.onRequest((req, res) => {
    const messagesRef = admin.database().ref('events')
    messagesRef.once('value', (snapshot) => {
        snapshot.forEach((child) => {
            child.forEach((child) => {
                if (Number(child.val()['endDate']) <= new Date().getTime()) {
                   child.ref.set(null)
              }
            })
        })
    })
    return res.status(200).end()
})

这里是 JSON

{   "events" : { "N5iTuYzAbJa02RauxCl3uh2Nggz1" : {  
"-LNmIvSdrwK96KCGcmXm" : {
    "addedBy" : "Riyadh Figures",
    "coordinate" : [ 24.70914690943994, 46.78851541131735 ],
    "endDate" : "1538442801.0",
    "imagePath" : "-LNmIvSdrwK96KCGcmXm",
    "key" : "-LNmIvSdrwK96KCGcmXm",
    "title" : "hjihgf",
    "userPicture" : "N5iTuYzAbJa02RauxCl3uh2Nggz1"   } }

【问题讨论】:

  • 请编辑问题以解释您希望该功能做什么。另外,你为什么不只查询要删除的孩子?在函数中查询所有内容并进行过滤可能会很慢而且很昂贵。
  • @DougStevenson 当它的“endDate”时间戳等于或小于当前时间戳时,该函数应该删除一个孩子,到时候它会删除除“坐标”孩子之外的所有孩子。另外,我将如何使用查询继续执行此操作?

标签: javascript node.js firebase firebase-realtime-database google-cloud-functions


【解决方案1】:

我不明白您要实现什么,到目前为止,如果事件节点已过期,您想删除它。像下面这样试试

var deleteObj ={}
messagesRef.once('value', (snapshot) => {
    snapshot.forEach((childSnap) => {
        childSnap.forEach((innerChild) => {
            if (Number(innerChild.val()['endDate']) <= new Date().getTime()) {
      // you can do this in two ways
      // step 1: Direct Deleting
               admin.database().ref('/events/' + childSnap.key + '/' + innerChild.key).set({}); 
      // step 2: Pass into Object
              deleteObj['/events/' + childSnap.key + '/' + innerChild.key] = null;
     // As you asked for deleting coordinate
             deleteObj['/events/' + childSnap.key + '/' + innerChild.key +'/' + 'coordinate']  = [] or {}; // this will do
          }
        })
    })
})

   if(deleteObj) // Step 2 
       admin.database().ref().update(deleteObj).then(function(){
           // console.log("Deleted");
       })

如果您有多个节点要删除,因为 fb 支持多路径更新或删除,第 2 步会很有帮助

正如道格在您的问题评论中所说,保留一件事。为什么你要下载整个数据来单独删除一些节点。

【讨论】:

  • 谢谢!我希望孩子“坐标”与过期节点中的其他孩子一起被删除。因为它是我的代码中唯一没有被删除的孩子。你能告诉我如何使用查询来删除过期的事件吗?
  • 非常感谢!!!如果你能告诉我,我很乐意使用查询删除过期的节点:)
  • 说真的我不懂人。例如,编辑您的问题并突出显示您要删除的节点,即(整个节点或子键)。
  • 基本上,我想在它过期后删除整个事件节点(包括该过期事件节点的所有子节点)。我希望我现在说得通了。
  • 函数每分钟运行一次,并将“endDate”与 JavaScript 中的当前时间进行比较,一旦当前时间超过“endDate”,它就会删除该事件节点,包括该事件下的所有子节点。
猜你喜欢
  • 2017-09-11
  • 2017-10-17
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
  • 1970-01-01
  • 2019-10-12
相关资源
最近更新 更多