我正在尝试将新用户添加到现有用户联系人列表的联系人列表中。每当将儿童(新用户)添加到用户列表时,它就有自己的联系人列表,现在他的联系人列表中的每个用户都需要使用新用户的联系方式进行更新。
我写了下面的云函数,它正在运行 -
var functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.newUserAdd = functions.database.ref('users/{uid}').onWrite(event => {
const userObj = event.data.val();
const userKey = event.data.key;
console.log("New user added: " + userKey + " " + userObj.display_name);
const userRef = admin.database().ref('/users');
return event.data.child('contacts').forEach(function(data1){
console.log("Updating " + data1.key + " adding contact: " + userKey);
userRef.child(data1.key).child('contacts').child(userKey).set({display_name:userObj.display_name,type:userObj.type});
});
});
但是,无论何时更新任何用户的数据,都会发生太多的调用。有没有办法只在添加新用户或更改任何用户的“display_name”或“type”时调用函数?
答案 0 :(得分:1)
您已陷入在共同根目录下嵌套不同数据类型的陷阱。在Firebase数据库中,建议将每种类型的数据保存在树的自身部分中。
在您的情况下,有两种类型的数据:
将这些模型建模为两个独立的顶级节点是非惯用的:
/users
您会注意到两个集合都使用exports.newUserAdd = functions.database.ref('users/{uid}').onWrite(event => {
if (!event.data.previous.exists() && event.data.exists()) {
作为密钥。这意味着一旦您知道他们的UID,您就可以轻松查找用户的个人资料或该用户的联系人。
使用这种结构,只有在用户的配置文件发生变化时才会触发。只需将您的功能注册为仅触发select co11,dbms_lob.substr(col2),col3 from a
minus
select co11,dbms_lob.substr(col2),col3 from b;
下的更改:
{{1}}
您注意到我还添加了一个条件,确保代码仅在首次写入用户记录时运行。