我正在使用Firebase Firestore来满足我的数据需求。我有一个数据模型,其中有一组苹果,每个文档代表一个唯一的苹果,该苹果有一个object类型的字段,该字段本质上是
把每个苹果文档想象成这样:
name: "SiberianApple",
weight: "400g"
color: {
today: "green",
yesterday: "red",
tomorrow: "crimson"
}
通过阅读文档,我了解到我们可以通过各种方式查询集合,但是否可以限制客户端在获取文档时需要获取的信息量。我是否可以对此字段进行查询color
,使其仅返回
name: "SiberianApple",
weight: "400g",
color: {
today: "green"
}
基本上类似于graphql,在这里我可以请求我想要的东西。我想知道是否可以查询,或者这个字段应该是这个文档的子集,这样我就可以使用subCollection的路径apples/<appleId>/colors
查询颜色了吗?
发布于 2021-10-17 10:03:00
Cloud Firestore监听器在文档级触发。无法仅通过文档中的特定字段触发,也无法拆分文档以仅获取一个属性。要么是整个文档,要么什么都没有。所以Firestore客户端SDK总是返回完整的文档。不幸的是,没有办法只请求文档的一部分。
是否有可能限制信息量。
如上所述,这是不可能的。您可以做的是创建另一个包含文档的集合,该集合只能包含您需要的字段。这种做法称为denormalization,在涉及到NoSQL数据库时,这是一种非常常见的做法。
发布于 2021-10-17 10:19:45
正如Alex在他的回答中解释的那样,使用客户端SDK不可能只获取文档字段的子集。当您获取一个文档时,您将获取它及其所有字段。
但是,使用Firestore REST API可以做到这一点:在REST API中,当您使用get
方法获取一个文档时,可以使用DocumentMask
。DocumentMask
将“将对文档的get操作限制为其字段的子集”。
对于查询多个文档,则略有不同:使用runQuery
方法。请求主体应包含一个JSON对象,该对象具有structuredQuery
属性。
反过来,StructuredQuery
有一个包含Projection
对象的select
属性。
下面是一个在调用runQuery
方法(即https://firestore.googleapis.com/v1/{parent=projects/*/databases/*/documents}:runQuery
)时使用的负载的示例:
const payloadObj = {
structuredQuery: {
where: {
// ....
},
orderBy: [
{
field: {
fieldPath: 'name',
},
direction: 'ASCENDING',
},
],
from: [
{
collectionId: 'apples',
},
],
select: {
fields: [
{
fieldPath: 'name',
},
{
fieldPath: 'weight',
},
{
fieldPath: 'color.today',
},
],
},
limit: 1000,
},
};
正如您在上面的代码中所看到的,使用fieldPath: 'color.today',
只能针对color
地图的一个属性
结束语: REST API的用户友好性不如客户端SDK,因为您需要构建传递给请求的有效负载并解析响应,但使用它并不困难。在web应用程序中,使用fetch
、axios
或gaxios
来执行调用。
https://stackoverflow.com/questions/69603039
复制相似问题