【问题标题】:retrieve doc data, where condition value is a subcollection value检索文档数据,其中条件值是子集合值
【发布时间】:2020-04-15 21:42:09
【问题描述】:

我在 firestore 上的数据库如下所示:

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

我想从 value == n 的候选项中检索(数据)

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

**Candidates 是 Collection,ID 是 doc,likeDislikeSuper 是 Candidates 的子集合。

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

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

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

【问题讨论】:

  • 你的查询肯定不对。 “/”不是字段分隔符,并且您不要在字段路径中重复集合的名称。但我不清楚你的结构是什么。您是在单个文档中显示嵌套地图,还是在 Candidates 中的文档下嵌套了子集合?请编辑问题以更清楚地了解您正在使用的数据。屏幕截图可能会有所帮助。
  • 嘿,Doug,谢谢,我用屏幕截图和有关结构的信息进行编辑。是的where 是不正确的,我这样做是为了“象征”我想要返回的东西。为什么我不知道该怎么做呢

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


【解决方案1】:

如果我理解正确,你需要使用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 文档的主集合,其中包含 candidateIds 的数组(如果您认为,也可以是 candidates 文档的子集合数组可能太大,以至于文档会到达1 MiB size limit)。

【讨论】:

  • 这会返回“候选人”数据集合吗?还是会从“likeDislikeSuper”集合中返回数据?我对文档有点困惑
  • 好的,我试试,但是返回likeDislikeSuper 文档,我要检索候选文档:/
  • 你的问题中camp值是什么意思??
  • where的第一个参数,where(fieldPath, operation, value)
  • 通过代码我认为是对的!但是我现在有一个以前的错误,我不知道如何解决它`错误:[firestore/failed-precondition]操作被拒绝,因为系统不是操作执行所需的状态。确保您的查询已通过 firebase 控制台编入索引。 ` 感谢您的耐心等待,我正在使用 firebase 一段时间
【解决方案2】:

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

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

【讨论】:

  • 我想在where()中使用“likeDislikeSuper”的子集合值,来检索候选文档
  • 对不起,我真的不知道你在说什么。在您的屏幕截图中,likeDislikeSuper 是一个子集合。我们看不到它的文档字段或值。请编辑问题以显示您希望查询找到的文档示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 2013-03-19
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
  • 2021-10-26
相关资源
最近更新 更多