我使用以下代码连续更新我的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(使用其他服务)。然后,我使用node检查存储数据的文件的更改并写入firebase数据库。它工作正常,但我不想更换数据库。我只是想更新更改的字段,因为我有其他服务在我想要保留的数据库中向这个子节点添加额外的数据。如何在不更换所有数据库的情况下仅更新包含更改的字段,这样可以保留不是来自此请求的其他额外数据?
答案 0 :(得分: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);