检索文档数据,其中条件值是子集合值

时间:2020-04-15 21:42:09

标签: javascript firebase react-native google-cloud-firestore

我在firestore上的数据库如下:

Candidates
    |
    |______ID_1
    |        |_______likeDislikeSuper
    |        |              |___________ID_1
    |     ( data )                        |_______value: n
    |
    |______ID_2
    |        |_______likeDislikeSuper
    |        |              |___________ID_2
    |     ( data )                        |_______value: n

我想从值== n的候选对象中检索(数据)

firestore()
  .collection('candidates')
  .where('candidates/ID_1/likeDislikeSuper/ID_1', '==', 'n')
  .get();

**“候选人”是一个集合,“ ID”是“文档”,就像DislikeSuper是“候选人”的子集合。

所以... where的第一个参数是camp value,不支持path

有人知道解决此问题的方法吗?

如何使用该值作为过滤器返回候选文档?

enter image description here

2 个答案:

答案 0 :(得分:2)

如果我理解正确,则需要使用Collection Group query,如下所示:

var likeDislikeSuperQuery = db.collectionGroup('likeDislikeSuper').where('value', '==', 'n');
likeDislikeSuperQuery.get().then(function (querySnapshot) {
    querySnapshot.forEach(function (doc) {
        console.log(doc.id, ' => ', doc.data());
    });
});

该查询将返回likeDislikeSuper子集合(所有候选人的 )下的所有文档,其中value字段等于'n'。


评论后更新:

如果要获取此查询返回的candidates文档的父级的所有likeDislikeSuper文档,可以执行以下操作:

var likeDislikeSuperQuery = db.collectionGroup('likeDislikeSuper').where('value', '==', 'n');
likeDislikeSuperQuery.get().then(function (querySnapshot) {
    querySnapshot.forEach(function (doc) {
        const parentCandidateRef = doc.ref.parent.parent;
        console.log('parentCandidate path: ', doc.ref.parent.parent.path);
    });
});

但是,这不是最有效的方法,因为多个likeDislikeSuper文档可能具有相同的父candidates文档。

您可以复制数据,例如,每个喜欢/不喜欢ID都有likeDislike个文档的主要集合,其中包含candidateId s的数组(或{{1的子集合}}文档,如果您认为数组可能太大而无法到达1 MiB size limit)。

答案 1 :(得分:0)

如果要查询用户的likeDislikeSuper子集合,则必须为其建立CollectionReference:

firestore()
  .collection('candidates')
  .doc('ID_1')
  .collection('likeDislikeSuper')
  .where('ID_1', '==', 'n')
  .get();