【问题标题】:Firebase Update specific fields?Firebase 更新特定字段?
【发布时间】:2017-11-30 13:27:36
【问题描述】:

我正在使用此代码不断更新我的 firebase 数据库:

var admin = require("firebase-admin");


// Fetch the service account key JSON file contents
var serviceAccount = require("service.json");

// Initialize the app with a service account, granting admin privileges

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "DATABASE_URL"

});

var db = admin.database();
var ref = db.ref("games");

var fs = require('fs');
var filePath = 'games/2017-06-27.json';
var file = fs.readFileSync(filePath);

fs.watchFile(filePath, function() {

var request = require('request');

var usersRef = ref.child('2017-06-27');



request('http://URL/games/2017-06-27.json', function (error, response, body) {
  if (!error && response.statusCode == 200) {

    var asJson = JSON.parse(body)


    usersRef.update(asJson)

   }
})

});

所以我得到了一个包含实时体育数据得分、比赛状态等的 json(使用其他服务)。然后,我使用节点检查存储数据的文件的更改并写入 firebase 数据库。它工作正常,但我不想更换数据库。我只想更新更改的字段,因为我有其他服务向我想要保留的数据库中的这个孩子添加额外的数据。如何在不替换所有数据库的情况下仅更新具有更改的字段,从而保留不是来自此请求的其他额外数据?

【问题讨论】:

    标签: json node.js firebase-realtime-database


    【解决方案1】:

    当您在某个位置调用 update() 时,Firebase 会循环遍历您传入的数据(在您的情况下为 asJson),并对每个键执行 ref.child(key).set(value)

    Object.keys(asJson).forEach((key) => {
      usersRef.child(key).set(asJson[key]);
    })
    

    因此,虽然它将asJson 的顶级属性与usersRef 下的现有数据合并,但仍会替换每个键下的数据。

    如果您也想在该级别上进行合并,则必须将 JSON 从树转换为路径列表。假设您的 JSON 如下所示:

    {
      user1: {
        name: "Speed_John"
      },
      user2: {
        name: "Frank van Puffelen"
      }
    }
    

    您必须将其转换为:

    {
      "user1/name": "Speed_John",
      "user2/name": "Frank van Puffelen"
    }
    

    var JSON = {
      user1: {
        name: "Speed_John"
      },
      user2: {
        name: "Frank van Puffelen",
        id: 209103
      }
    };
    
    var updates = {};
    function flatten(json, prefix) {
      Object.keys(json).forEach((key) => {
        var path = (prefix||"")+"/"+key;
        if (typeof json[key] === "object") {
          flatten(json[key], path);
        }
        else {
          updates[path] = json[key];
        }
      });
    }
    
    flatten(JSON);
    console.log(updates);

    使用此代码,您可以调用:

    usersRef.update(updates);
    

    【讨论】:

    • 对于我来说,如果 Phonenumber 匹配,我需要将字段更新为状态为 true ,但是当我使用 Firestore 的云功能更新它存储在文档末尾的字段时。你能帮我摆脱这些状况吗
    猜你喜欢
    • 2019-03-12
    • 2021-12-01
    • 2021-03-15
    • 2019-03-29
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 2016-11-24
    相关资源
    最近更新 更多