某个路径内的collectionGroup

时间:2019-07-08 12:27:26

标签: firebase google-cloud-firestore

我想在某个路径内进行一个集合组查询,这意味着我不仅要以collectionId为目标,而且还要以集合的位置为目标。

让我们使用文档中使用的示例对其进行更好的解释。我们将在城市中拥有地标,并在他们自己的收藏中拥有“一般”地标:

let citiesRef = db.collection('cities');

let landmarks = Promise.all([
  citiesRef.doc('SF').collection('landmarks').doc().set({
    name: 'Golden Gate Bridge',
    type: 'bridge'
  }),
  citiesRef.doc('SF').collection('landmarks').doc().set({
    name: 'Legion of Honor',
    type: 'museum'
  }),
  citiesRef.doc('LA').collection('landmarks').doc().set({
    name: 'Griffith Park',
    type: 'park'
  }),
  citiesRef.doc('LA').collection('landmarks').doc().set({
    name: 'The Getty',
    type: 'museum'
  }),
  citiesRef.doc('DC').collection('landmarks').doc().set({
    name: 'Lincoln Memorial',
    type: 'memorial'
  })
]);

let generalLandmarks = Promise.all([
  db.collection('landmarks').doc().set({
    name: 'National Air and Space Museum',
    type: 'museum'
  }),
  db.collection('landmarks').doc().set({
    name: 'Ueno Park',
    type: 'park'
  }),
  db.collection('landmarks').doc().set({
    name: 'National Museum of Nature and Science',
    type: 'museum'
  }),
  db.collection('landmarks').doc().set({
    name: 'Jingshan Park',
    type: 'park'
  }),
  db.collection('landmarks').doc().set({ 
    name: 'Beijing Ancient Observatory',
    type: 'museum'
  })
]);

现在,我想查询城市中的地标,而不是一般的地标。我想以一种更简单的方式做这样的事情:

let museums = db.collection('cities').collectionGroup('landmarks').where('type', '==', 'museum');

有可能吗?

2 个答案:

答案 0 :(得分:1)

Cloud Firestore当前无法实现。当执行集合组查询时,它将使用具有给定名称的所有集合和子集合。您无法将查询范围缩小到特定集合。

您可以做的是在每个子集合的文档中存储一个字段,以标识它们属于哪个顶级集合,然后使用该字段过滤结果。

答案 1 :(得分:0)

  

现在,我想查询城市中的地标,而不是一般的地标。

不,您不能。集合组查询将返回所有具有相同名称(包括常规名称)的集合或子集合的结果。您无法更改它。

解决方案是,如果您想限制集合组查询的范围,请将集合名称更改为其他名称。

如果您的应用程序正在生产中,并且您无法更改集合的名称,只需尝试忽略获得客户端的结果。如何做到这一点,只需看一下文档的路径并查看哪个集合属于。这样,您只能使用所需集合中的结果。

另一种解决方法是在名为isGeneral的集合中添加类型为boolean的新属性,并在常规集合中将其设置为true,在其他集合中将其设置为false。要仅获取特定项目而不是一次性项目,请在查询中添加where调用:

whereEqualTo("isGeneral", false);