【问题标题】:Filtering Firebase Firestore document's array of maps过滤 Firebase Firestore 文档的地图数组
【发布时间】:2021-03-25 09:50:49
【问题描述】:

我在一个文档中有一个名为 carton 的字段,它是一个地图数组。

**each document in a collection 
**document-1
    { lotNo: 'alg-100', 
      cartons:[
              {cartonNo:01, trackingNo:'a'},
              {cartonNo:02, trackingNo:'b'},
              {cartonNo:03, trackingNo:'c'},
              {cartonNo:04, trackingNo:'a'}
             ]
    }

**document-2
    { lotNo: 'alg-101', 
      cartons:[
              {cartonNo:01, trackingNo:'a'},
              {cartonNo:02, trackingNo:'b'},
              {cartonNo:03, trackingNo:'c'},
              {cartonNo:04, trackingNo:'a'}
             ]
     }

我需要的只是每个文档中 trackingNo='a' 的纸箱对象。据我所知,我无法从 Firestore 文档中获取部分数据(要么获取完整文档)。因此,为了从不同的文档中获取类似 trackingNo 的纸箱对象,我假设获取两个文档,然后在客户端过滤数据。或者有没有更好的方法?什么是仅实现来自不同文档的具有相似 trackingNo(作为数组)的纸箱的最佳解决方案(不更改数据结构,因为我的应用程序严重依赖此特定数据结构)?

【问题讨论】:

  • 您能说明一下您的预期结果吗?您到底想从 Firestore 中获得什么?如果您要对 trackingNo = 'a' 显示的内容进行查询,则将返回 document-1 和 document-2。这就是你想要的吗?

标签: firebase google-cloud-firestore


【解决方案1】:

很遗憾,您不能根据数组内的属性进行索引。在实时数据库中,数组的属性可以被索引为cartons.<index>.trackingNo(例如cartons.0.trackingNo),但是如果您查询这个,您只会得到包含请求的跟踪号作为其第一个纸箱条目的文档。要获得所有结果,您需要再次查询每个后续索引 - cartons.1.trackingNocartons.2.trackingNo 等等。

如果数据像您显示的那样简单,最好的选择是稍微调整您的数据结构,以便您在给定批次中也存储一个跟踪号列表。这将允许您对 trackingNos 属性执行 array-contains queries

{
  lotNo: 'alg-101', 
  cartons: [
    { cartonNo: 01, trackingNo: 'a' },
    { cartonNo: 02, trackingNo: 'b' },
    { cartonNo: 03, trackingNo: 'c' },
    { cartonNo: 04, trackingNo: 'a' }
  ],
  trackingNos: [
    'a',
    'b',
    'c'
  ]
}

如果您的数据已被简化为在此处发布,您最好对数据库进行重组,其中每个纸箱都是称为纸箱的批次文档的子集合的成员(即.../lots/alg-101/cartons/01)并结合@987654322 @。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    • 2020-07-12
    • 1970-01-01
    • 2019-01-05
    • 2019-01-27
    相关资源
    最近更新 更多