首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据Firestore中的文档字段限制数据

根据Firestore中的文档字段限制数据
EN

Stack Overflow用户
提问于 2021-10-17 09:41:00
回答 2查看 50关注 0票数 0

我正在使用Firebase Firestore来满足我的数据需求。我有一个数据模型,其中有一组苹果,每个文档代表一个唯一的苹果,该苹果有一个object类型的字段,该字段本质上是

把每个苹果文档想象成这样:

代码语言:javascript
运行
复制
name: "SiberianApple",
weight: "400g"
color: {
  today: "green",
  yesterday: "red", 
  tomorrow: "crimson"
}

通过阅读文档,我了解到我们可以通过各种方式查询集合,但是否可以限制客户端在获取文档时需要获取的信息量。我是否可以对此字段进行查询color,使其仅返回

代码语言:javascript
运行
复制
name: "SiberianApple",
weight: "400g",
color: {
   today: "green"
}

基本上类似于graphql,在这里我可以请求我想要的东西。我想知道是否可以查询,或者这个字段应该是这个文档的子集,这样我就可以使用subCollection的路径apples/<appleId>/colors查询颜色了吗?

EN

回答 2

Stack Overflow用户

发布于 2021-10-17 10:03:00

Cloud Firestore监听器在文档级触发。无法仅通过文档中的特定字段触发,也无法拆分文档以仅获取一个属性。要么是整个文档,要么什么都没有。所以Firestore客户端SDK总是返回完整的文档。不幸的是,没有办法只请求文档的一部分。

是否有可能限制信息量。

如上所述,这是不可能的。您可以做的是创建另一个包含文档的集合,该集合只能包含您需要的字段。这种做法称为denormalization,在涉及到NoSQL数据库时,这是一种非常常见的做法。

票数 1
EN

Stack Overflow用户

发布于 2021-10-17 10:19:45

正如Alex在他的回答中解释的那样,使用客户端SDK不可能只获取文档字段的子集。当您获取一个文档时,您将获取它及其所有字段。

但是,使用Firestore REST API可以做到这一点:在REST API中,当您使用get方法获取一个文档时,可以使用DocumentMaskDocumentMask将“将对文档的get操作限制为其字段的子集”。

对于查询多个文档,则略有不同:使用runQuery方法。请求主体应包含一个JSON对象,该对象具有structuredQuery属性。

反过来,StructuredQuery有一个包含Projection对象的select属性。

下面是一个在调用runQuery方法(即https://firestore.googleapis.com/v1/{parent=projects/*/databases/*/documents}:runQuery)时使用的负载的示例:

代码语言:javascript
运行
复制
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应用程序中,使用fetchaxiosgaxios来执行调用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69603039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档