如何删除angularfire2中的链接引用?

时间:2017-01-15 15:09:49

标签: javascript firebase firebase-realtime-database angularfire2

我有三个模型City(有多个Block s),Block(有多个Area s)和Area(一对多关系继续到其他模型,这里没有显示)。

从图片中可以看出,我已将数据展平并使用fgets引用。

我的问题是存储此数据的最佳方法是什么以及如何删除所有链接的引用?假设当删除一个城市时,应删除所有Block的引用和与Block链接的所有区域。

以下是数据结构

enter image description here

我现在用来删除的代码是,而不是区域删除:

$key

请提供有关数据设计和删除过程的建议。

1 个答案:

答案 0 :(得分:1)

你应该做的第一件事就是等到块被移除后再移除城市:

import 'rxjs/add/operator/first';
import 'rxjs/add/operator/toPromise';

// Use the first operator to take the first emitted list and then
// complete the observable and use the toPromise operator to
// convert it into a promise for simpler chaining.

deleteCity(city: City): void {
  this.af.database
    .list(`/cities/${city.$key}/blocks`, { preserveSnapshot: true })
    .first()
    .toPromise()
    .then(snapshots => {
      snapshots.forEach(snapshot => {
        this.af.database.object(`/blocks/${snapshot.key}`).remove();
      });
    })
    .then(() => this.af.database.list('/cities').remove(city.$key))
    .then(() => this.appstore.dispatch({ type: DELETE_CITY, payload: city});
);

你也应该为区域做类似的事情。

除此之外,对数据库结构的任何更改都取决于您希望如何访问数据。

如果您只需要在城市和区域上下文区域中访问区块,并且从不需要访问任意区块或区域,您可以在其路径中包含城市密钥:

/areas/$cityKey/$areaKey
/blocks/$cityKey/$blockKey

删除城市的所有街区和区域等都是微不足道的。

另一种选择是使用每个块中的cityKey子属性。您可以通过以下查询获取:

this.af.database
  .list(`/blocks`, {
    preserveSnapshot: true,
    query: {
      orderByChild: 'cityKey',
      equalTo: '-KaXa...'
    }
  })

同样,如果您向区域添加cityId子项,则可以以类似方式查询这些子项。这至少可以避免必须获得一个城市的所有区块以及每个区块的所有区域;你只需使用城市钥匙获得所有街区和区域。