Firebase云功能未更新记录

时间:2018-11-15 16:20:29

标签: reactjs list firebase favorites

想象这种情况:

您有一个包含100个项目的列表,一个用户喜欢的列表中的12个项目。

用户现在希望将这12个项目与最新数据一起显示在新列表中(如果数据从原始列表/节点更改)

什么是最好的方法,而不必对每个项目的所有数据进行非规范化处理?

有一种方法来orderByChild()。equalTo(多个项目

多个项目是收藏的项目)

当前,我已成功在新列表中显示收藏夹,但我将所有数据推送到带有收藏夹的用户节点,问题是当我更改数据时,其收藏夹中的数据不会更改。

注意-这些更改是在数据库中手动进行的,用户无法更改(可能会更改的元数据)


更新

我现在正在尝试通过云功能实现这一目标。我正在尝试更新项目,但似乎无法正常工作。

这是我的代码:

exports.itemUpdate = functions.database
  .ref('/items/{itemId}')
  .onUpdate((change, context) => {

  const before = change.before.val();  // DataSnapshot after the change
  const after = change.after.val();  // DataSnapshot after the change

  console.log(after);

  if (before.effects === after.effects) {
    console.log('effects didnt change')
    return null;
  }
   const ref = admin.database().ref('users')
   .orderByChild('likedItems')
   .equalTo(before.title);

   return ref.update(after);
});

我不确定这里做错了什么。

干杯!

1 个答案:

答案 0 :(得分:0)

没有一种方法可以在orderByChild中执行多个项目,在NoSQL中进行非规范化就可以保持同步,就像您提到的那样。我建议您使用Cloud Function,它可以帮助您保持同步。

另一种选择是使用Firestore代替实时数据库,因为它具有更好的查询功能,您可以在其中将用户ID存储在文档中,并使用包含过滤器的数组可以获取所有用户的帖子。

以下是用于更新项目的实时数据库触发器的Cloud功能的启动。

exports.itemUpdate = functions.database.ref('/items/{itemId}')
    .onUpdate((snap, context) => {
        // Query your users node for matching items and update them
    });