使用 Node.js SDK 通过 Firestore 进行 CRUD
Cloud Firestore 非常适合构建内部应用,因为它可以帮您处理数据库管理的所有复杂细节。在本教程中,我们将向您展示如何使用 Node.js SDK 通过 Cloud Firestore 设置一个基本的 CRUD 应用:
为 Cloud Firestore 设置 Node.js SDK
首先,您需要安装 Node.js 客户端库并初始化数据库实例。您可以通过npm安装该库:
npm install firebase-admin --save
安装软件包后,您需要初始化数据库。您可以使用Firebase Cloud Functions、Google Cloud Platform 或您自己的服务器来完成此操作。在本教程中,我们将快速向您展示如何使用服务帐户(用于向应用程序发出 API 请求的帐户身份)在您自己的服务器上初始化数据库(在此处了解有关服务帐户的更多信息)。
首先,您需要进入 Google Cloud Platform 帐户中的“服务帐户”菜单(位于“IAM 和管理员”下)。从那里,生成一个新的私钥,将其保存为 JSON 文件,然后将其添加到您的服务器。
然后,在您的index.js
文件中引入该firebase-admin
库,并从服务器导入您的服务帐号私钥。使用该firebase-admin
库初始化您的应用程序,并传递一个对象credential
作为键,并firestore.credential.cert()
以您的服务帐号作为参数作为值。
const fs = require('firebase-admin');
const serviceAccount = require('./path/to/key.json');
fs.initializeApp({
credential: fs.credential.cert(serviceAccount)
});
最后,调用firestore()
方法来创建数据库。
const db = fs.firestore();
使用 Firestore Node.js SDK 进行基本 CRUD
如果没有一些示例数据,这根本算不上一个 CRUD 教程,所以让我们先来了解一下。假设我们正在为一家在线零售商构建内部工具——比如说一个向客服代表展示用户数据的工具:
{
"first": "Liam",
"last": "Ragozzine",
"address": "133 5th St., San Francisco, CA",
"birthday": "05/13/1990",
"age": "30"
},
{
"first": "Vanessa",
"last": "Peluso",
"address": "49 Main St., Tampa, FL",
"birthday": "11/30/1977",
"age": "47"
}
当然,这个数据集过于简单了 - 对于更复杂的设置,有几种在 Firestore 中构建数据的选项:
- 文件
- 多个集合
- 文档内的子集合
每种方案都有其优缺点,体现在易用性、可扩展性和复杂性方面。您可以点击此处,了解更多关于在 Cloud Firestore 中构建数据的信息。
明白了吗?太棒了!现在开始 CRUD。
使用创建数据set()
要填充数据库,我们将使用set()
方法。首先,我们要指定要用users
该collection()
方法填充集合。为此,只需将集合的名称作为字符串传递给方法即可:
const usersDb = db.collection('users');
现在,我们需要指定第一个文档,以便添加新用户 Liam Ragozzine。为此,我们将使用doc()
方法。要使用此方法,请将id
文档的doc()
以字符串形式传入。在本例中,id
为“lragozzine”。
const liam = usersDb.doc('lragozzine');
指定我们要添加的文档后,我们可以通过将数据作为对象传递进去来设置文档的数据set()
。
await liam.set({
first: 'Liam',
last: 'Ragozzine',
address: '133 5th St., San Francisco, CA',
birthday: '05/13/1990',
age: '30'
});
太棒了!现在,如果我们想添加第二个用户,它看起来会像这样:
await usersDb.doc('vpeluso').set({
first: 'Vanessa',
last: 'Peluso',
address: '49 Main St., Tampa, FL',
birthday: '11/30/1977',
age: '47'
});
需要注意的是:set()
如果文档已存在,该方法将覆盖该文档。我们之前一直使用.doc(ID)
来通过 创建新文档set()
,但如果传入的 ID 对应的文档已存在,则传入的数据.set()
将覆盖当前存在的数据。
现在我们的数据库中已经有了数据,我们可以继续读取它。
使用以下方式读取数据get()
要从 Firestore 读取数据,请使用get()
方法。要从集合中读取,请collection()
在调用 之前指定get()
。或者,如果您需要从文档中读取,请doc()
在调用 之前指定get()
。
// get collection
const users = await db.collection('users').get();
// get document
const liam = await db.collection('users').doc('liam').get();
如果文档不存在,结果将为空。因此,在上面的例子中,liam
将没有数据。您可以通过在文档上调用 exist 来检查这一点。如果文档存在exists
,它将返回 true,您可以调用它data()
来读取文档的数据。否则,它将返回 false。
if (!liam.exists) {
console.log('No document');
} else {
console.log(liam.data());
}
要过滤(“查询”)结果,您可以使用where()
,它接受三个参数:
- 集合中用于测试值的字段
- 关系运算符(例如 <、> 或 ==)
- 要评估的第一个参数的值
例如,如果我们想要 40 岁以下用户的所有文档,我们将使用以下命令:
const under30 = await
db.collection('users').where('age', '<=', 40).get();
onSnapshot()
Cloud Firestore 的一大亮点在于,您可以使用方法获取数据的实时更新。这让您可以监听数据库中任何文档的更改。初始化 方法并传递一个回调函数来处理数据后,每次内容发生变化时,您都会收到更新。
const liam = db.collection('users').doc('liam');
const observer = liam.onSnapshot(snapshot => {
console.log(`changes: ${snapshot}`);
}, err => {
console.log(`Error: ${err}`);
});
现在,您的应用已跟上最新趋势。😎
set()
使用和更新数据update()
在 Firestore 中,有两种更新数据的方法:set()
或update()
。简而言之,使用set()
通常会覆盖您正在处理的整个文档,而update()
最适合更新特定字段,同时保持其他字段不变。
首先set()
,如果我们想在 Liam 的文档中注明他已婚,我们会set()
使用对象进行调用{ married: true }
。正如我们上面提到的,需要注意的是,如果对已存在的文档使用 set() ,除非您像这样指定,否则它将被覆盖merge: true
:
const liam = await
db.collection('users').doc('lragozzine').set({
married: true
}, { merge: true });
提示:如果您不确定文档是否已经存在,请添加merge
以防万一,这样就不会覆盖您的数据。
要使用此update()
方法更新文档中的字段,请将包含要更新的字段的对象作为参数传递给update()
。
const liam = await
db.collection('users').doc('lragozzine').update({
married: true
});
要更新嵌套对象中的数据,您还需要使用update()
。如果我们想添加一个包含客户喜爱事物(例如喜欢的颜色、产品线或 90 年代的烂电视节目)的键值对的对象,我们会传递一个以路径为键的对象,如下所示:
const liam = await
db.collection('users').doc('lragozzine').update({
'favorites.item': 'Ties'
});
现在我们知道如何合并和更新我们的文档,让我们继续删除。
删除数据delete()
这应该不奇怪:你可以使用delete()
方法从 Firestore 中删除数据。它看起来像这样:
await db.collection('users').doc('lragozzine').delete();
这将从数据库中删除 Liam 的整个文档users
。
注意:删除文档并不会删除该文档的子集合。因此,如果 Liam 的文档中有一个包含订单数据的文档的子集合,名为orders
,那么即使删除了该lragozzine
文档,我们仍然可以访问该子集合orders
,如下所示:
const liamOrders = await db.collection('users').doc('lragozzine')
.collection('orders').doc('123').get();
要删除字段,请在命令FieldValue.delete()
中使用update()
。首先,必须导入FieldValue
对象,然后调用delete()
它,如下所示:
const FieldValue = fs.firestore.FieldValue;
const r = await
db.collection('users').doc('lragozzine').update({
married: FieldValue.delete();
});
删除整个集合会稍微复杂一些,因为您必须发出请求来检索集合中的所有文档,然后逐个删除它们。有关删除集合的更多信息,请参阅Firebase 指南。
恭喜!您现在是 Cloud Firestore CRUD 专家了。
文章来源:https://dev.to/retool/crud-with-firestore-using-the-node-js-sdk-anp