在缺少字段时按顺序排序会限制结果

时间:2018-11-16 01:12:57

标签: firebase google-cloud-firestore

我遇到了Firestore的问题,这对我来说是非常不直观的,因此我想知道是否有人可以帮助我了解Firestore为什么给出此结果。

比方说,我有一个名为“ people”的集合,其字段为“ firstName”和“ lastName”。假设我在该集合中有20个文档,这些文档的姓氏为“ Quaid”。然后,我有一个字段“ inCanada”,仅存在于这20个文档的子集中,比如说5。其他15个文档没有该字段。

令人惊讶的是,使用该可选字段的orderBy子句实际上是在过滤结果集,而不是仅对结果集进行排序,这与其他数据库相比对我来说没有意义。

在下面的示例中,我希望两个结果集都具有20个元素,但是第二个具有orderBy的结果集仅具有存在该字段的那5个文档。

有人可以解释为什么Firestore这样做吗?

const Admin = require('firebase-admin');

(async function () {
  const initFirebase = require('../initFirebase');
  initFirebase();

  const people = Admin.firestore().collection('people');
  const quaids = people.where('lastName', '==', 'Quaid')
  const quaids1 = await quaids.get();
  const quaids2 = await quaids.orderBy('inCanada', 'desc').get();

  console.log(quaids1._size); // 20
  console.log(quaids2._size); // 5
})();

1 个答案:

答案 0 :(得分:2)

简而言之,这是因为Firestore查询基于索引:每次创建文档时,Firestore都会为文档的每个字段创建一个索引。

因此,由于“ inCanada”字段仅在“ 20个文档的子集中”出现,因此“ inCanada”索引中仅存在该文档子集,导致出现您提到的情况。

Firebase团队的Todd Kerpelman的官方视频对此进行了很好的解释:https://www.youtube.com/watch?v=Ofux_4c94FI#t=4m17s。 (此链接将在4分17秒打开视频,即在开始对索引机制进行说明时。但是,索引对索引的 impact 的影响更多是在6m22s左右!)

如果要在查询结果中包括其他文档,则应为这些文档的“ inCanada”字段写一个值,例如,使用false值(对于{属于“ inCanada”的文档)。

相关问题