DAY13 - 认识与操作 firestore

上一篇,建立了firestore资料库,并且成功与前端连接,读取到资料库的资料,那麽这一篇就来认识一下,什麽是 firestore、firestore可以做什麽。

什麽是 firestore?

firestore 是 NoSQL 资料库

之前有提到 firestore 是 NoSQL 的资料库,那什麽是 NoSQL 呢? 和 NoSQL 相对应的就是 SQL ,SQL 最主要是用来查询关联式资料库

关联式资料库将不同的资料放在不同的表里面存放,会建立不同表的关联,并且使用查询语法去查询想要的资料,例如:

SELECT * FROM USERS WHERE age>20;

因此怎麽设计资料库,资料库的栏位与结构等等就是一个重要且复杂的工作。

而 NoSQL 强调的就是,不需要去强调不同表之间的关系,也不需要去设计资料库的栏位。资料皆以 key-value pair 的方式,以 JSON 的格式储存。也就不用去烦恼怎麽设计资料库。非常适合对於後端没有完整概念的前端入门後端的一个方法。

而 firestore 就是一个很棒一窥後端世界的好工具。

firestore 的集合与文件

在 firestore 虽然不用去设计资料库的栏位,但是有两项要认识的是集合(collection)与文件(document)

https://ithelp.ithome.com.tw/upload/images/20210928/201201072qjDTryRE8.png

在 google 官方文件说明,将 collection 比喻为资料夹,而将 document 比喻为资料夹的文件。
https://ithelp.ithome.com.tw/upload/images/20210928/20120107hSq3ySeFbp.png

也就是像这张图片一样,建立一个水果的集合,下面文件就是各个水果。当然水果的内容要记录什麽也没有强制规定一定都要一样。

像是可以纪录苹果的价钱、香蕉的产地、橘子的样貌、西瓜的品种不同的资讯都可以,端看自己的需求与操作,没有任何强硬的限制。

操作firestore CRUD

简单认识了什麽是firestore之後,接下来用 angular-fire 来对 firestore 做最基本的 CRUD的动作

假设要对於水果这个集合做各种动作,那麽先定义好水果的集合

fruitCollection = this.firestore.collection('fruits');

新增资料

新增资料,分为三种:

  1. 无记名新增: 只要新增资料,firestore会随机指定一个id
  2. 随机记名新增:不让firestore随机指定,而是在打到资料库之前,自行随机指定
  3. 指定名称新增:名称有重要的意义,自己指定特别名称
addDataWithoutName(): void {
    this.fruitCollection.add({
      price: 20,
    });
  }

  addDataWithRandomName(): void {
    const id = this.firestore.createId();
    this.fruitCollection.doc(id).set({
      height: '18cm',
    });
		// 新增完可以直接拿 id 做下一步其他的操作
  }

  addDataWithSpecificName(): void {
    this.fruitCollection.doc('pineapple').set({
      weight: 600,
    });
  }

以上就是三个不同的方法打到资料库之後,结果的呈现

https://ithelp.ithome.com.tw/upload/images/20210928/20120107nkQjNQlBY5.png

  • 如果不在乎文件的名称的话,直接使用 add 的方法,带入资料的内容即可。
  • 但是如果需要文件的名称,又不讲究文件名称的话,可以使用内建的 createId 方法帮你产生id,再去建立内容。这样的使用情境大多数为文件建立之後,马上会去做更新的动作会常用到
  • 如果在意文件名称的话,也可以自己指定,但是要注意的是,如果文件名称和原有的重复的话,会直接 覆盖原有的文件

更新资料

updateDoc():void{
    this.fruitCollection.doc('pineapple').update({
      price:200
    })
  }

更新资料非常简单,只要指定文件名称,使用 update 方法之後,只需要填入要更新的部分,就可以更新文件罗

https://ithelp.ithome.com.tw/upload/images/20210928/201201070lkiNel0AQ.png

像原本的的凤梨只有重量的资讯,现在透过更新的方法加入价格的资讯

删除资料

deleteDoc(){
    this.fruitCollection.doc('pineapple').delete()
  }

删除资料的方法同样很简单,只要使用 delete的方法就好了。

以上的方法angular fire 都包装成 promise 如果想要进行下一步的动作,使用 then 就可以继续执行了。

如果想要使用 rxjs 的 observable的方式进行的话,只要将promise 转换就好了

addDataWithoutName(): void {
    const add = this.fruitCollection.add({
      price: 20,
    });
    // 将 promise 转换成 observable
    from(add).subscribe(() => {
      //下一步动作
    });
  }

读取资料

angular fire 将读取资料直接包装成 observable 的方法,并且还有监听变动的功能,也就是说只要资料库有变动,会自动得到最新的资料,不用前端去呼叫检查更新。这个就是 firestore 强大的地方

fruitList$: Observable<any[]> = this.fruitCollection.valueChanges();
fruitList: any[] = [];

getFruitList(): void {
  this.fruitList$.subscribe((fruitList) => (this.fruitList = fruitList));
}


<<:  Day 16 - 演算大法好逼

>>:  [Day28] Flutter - Application Click Game (part12)

Node套件运用测试

因为我看到说node可以利用套件来使撰写程序较简单方便些,所以我这边就想用express套件来做个简...

【Day02】永丰金融APIs-消费支付API

今天台风天,不知各位今天是否安好! 首先开始挑战是银行端的API~ 永丰银行B2B应用有四大API,...

Day 21 Compose UI Animation III

今年的疫情蛮严重的,希望大家都过得安好,希望疫情快点过去,能回到一些线下技术聚会的时光~ 今天目标:...

Day26,Kubecost 体验,算钱好难......

正文 kubectl create ns kubecost wget https://raw.git...

第20天 - 来试着做一个简易购物系统(4)购物车卡关了,先确定能新增资料:(

昨天把购物车的资料表建好了(表 car)。 今天购物车制作的理想步骤应该是: 按下"加到购...