想象这种情况:
您有一个包含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);
});
我不确定这里做错了什么。
干杯!
答案 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
});