我遇到了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
})();
答案 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”的文档)。