我是firebase的新手 . 我在Firebase实时数据库中有数据,结构如下 . 我的要求是为“user”下的多个(选定)记录添加一个新字段 .
初始数据
db—>user
—pushId_1 (Auto Generated via push command)
name: user1
pushId_2
name: user2
添加了一个字段所需的最终数据(“newField”)
db—>user
—pushId_1
name: user1
newField: sample data
pushId_2
name: user2
newField: sample data
我写了以下代码来执行此操作 .
exports.sampleFunction = functions.database.ref('/db/user/{pushId}/')
.onCreate((snap, context) => {
console.log('onCreate called with snapshot id = ' + snap.key);
admin.database().ref('/db/user/').once('value').then(snapshot => {
if (snapshot.numChildren() > 1) {
var updates = {};
var count = 0;
snapshot.forEach((child) => {
if (!child.hasChild('newField') && count < 2) {
updates[child.key] = { newField: 'sample data' };
count++;
}
});
//return snapshot.ref.set(updates); //set is also giving same result.
return snapshot.ref.update(updates);
}
return null;
}).catch(error => {
console.error("error in fetching data from db." + error);
});
return null;
});
问题是,此代码正在删除现有字段“name”并将其替换为“newField” . 你可以帮我把这个新字段附加到数据而不删除现有字段 .
谢谢
1 回答
那是因为您使用的是set而不是更新节点 .
Set替换任何内容,而update如果缺少则添加字段,并且只有在新数据中存在时才替换字段 .
return snapshot.ref.update(updates);
您还要将数据设置错误以进行更新 . 在密钥中,您需要具有相对于您调用更新而不是嵌套对象的引用的路径 . 应该是,而不是
updates[child.key] = { newField: 'sample data' };
现在,当您使用
child
parent(即快照)调用update时,它确切地知道要更新哪些字段 .有关更多详细信息,请参阅文档:https://firebase.google.com/docs/database/admin/save-data#section-update