上一篇,建立了firestore资料库,并且成功与前端连接,读取到资料库的资料,那麽这一篇就来认识一下,什麽是 firestore、firestore可以做什麽。
之前有提到 firestore 是 NoSQL
的资料库,那什麽是 NoSQL 呢? 和 NoSQL 相对应的就是 SQL ,SQL 最主要是用来查询关联式资料库
关联式资料库将不同的资料放在不同的表里面存放,会建立不同表的关联,并且使用查询语法去查询想要的资料,例如:
SELECT * FROM USERS WHERE age>20;
因此怎麽设计资料库,资料库的栏位与结构等等就是一个重要且复杂的工作。
而 NoSQL 强调的就是,不需要去强调不同表之间的关系,也不需要去设计资料库的栏位。资料皆以 key-value pair
的方式,以 JSON 的格式储存。也就不用去烦恼怎麽设计资料库。非常适合对於後端没有完整概念的前端入门後端的一个方法。
而 firestore 就是一个很棒一窥後端世界的好工具。
在 firestore 虽然不用去设计资料库的栏位,但是有两项要认识的是集合(collection)与文件(document)
在 google 官方文件说明,将 collection 比喻为资料夹,而将 document 比喻为资料夹的文件。
也就是像这张图片一样,建立一个水果的集合,下面文件就是各个水果。当然水果的内容要记录什麽也没有强制规定一定都要一样。
像是可以纪录苹果的价钱、香蕉的产地、橘子的样貌、西瓜的品种不同的资讯都可以,端看自己的需求与操作,没有任何强硬的限制。
简单认识了什麽是firestore之後,接下来用 angular-fire 来对 firestore 做最基本的 CRUD的动作
假设要对於水果这个集合做各种动作,那麽先定义好水果的集合
fruitCollection = this.firestore.collection('fruits');
新增资料,分为三种:
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,
});
}
以上就是三个不同的方法打到资料库之後,结果的呈现
add
的方法,带入资料的内容即可。createId
方法帮你产生id,再去建立内容。这样的使用情境大多数为文件建立之後,马上会去做更新的动作会常用到覆盖
原有的文件updateDoc():void{
this.fruitCollection.doc('pineapple').update({
price:200
})
}
更新资料非常简单,只要指定文件名称,使用 update
方法之後,只需要填入要更新的部分,就可以更新文件罗
像原本的的凤梨只有重量的资讯,现在透过更新的方法加入价格的资讯
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));
}
>>: [Day28] Flutter - Application Click Game (part12)
因为我看到说node可以利用套件来使撰写程序较简单方便些,所以我这边就想用express套件来做个简...
今天台风天,不知各位今天是否安好! 首先开始挑战是银行端的API~ 永丰银行B2B应用有四大API,...
今年的疫情蛮严重的,希望大家都过得安好,希望疫情快点过去,能回到一些线下技术聚会的时光~ 今天目标:...
正文 kubectl create ns kubecost wget https://raw.git...
昨天把购物车的资料表建好了(表 car)。 今天购物车制作的理想步骤应该是: 按下"加到购...