在嵌套对象中使用firestore的FieldPath.documentId()

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在嵌套对象中使用firestore的FieldPath.documentId()相关的知识,希望对你有一定的参考价值。

这是我的数据的结构:

“

因此element有一个cluster对象,cluster对象有一个带有一个或多个tags对象的tag对象。

这与Firebase的非规范化数据结构Explained here内联。 (我们使用多路径更新和查找表来保持数据一致,这意味着tags不能为数组!)

我想查询嵌套tags对象的文档ID。我知道firestore.FieldPath.documentId()返回文档ID,这样就可以在查询中使用它:

db.collection('elements').where(firestore.FieldPath.documentId(), 'in',  ["a element document id"]).get().then((res) => 
    console.log(res);
).catch((err) => 
    console.log(err);
);

但是我希望像这样在嵌套对象上使用它

db.collection('elements').where('cluster.tags.'+firestore.FieldPath.documentId(), 'in',  ["a element document id"]).get().then((res) => 
    console.log(res);
).catch((err) => 
    console.log(err);
);

我没想到它会像我的例子一样工作,但是我看不到任何例子。 elements.cluster.tags是有效的FieldPath,因此如何在documentId()查询中访问.where()

有什么想法吗?

答案

firestore.FieldPath.documentId()实际上没有返回文档ID。它在客户端上返回FieldPath令牌对象。它不能参与字符串连接,因为它在客户端上还没有最终的字符串值。只有在服务器上解释时,它才会实现实际的字符串值。因此,您现在想做的事实际上是不可能的。请注意,where()的API文档显示,仅当将FieldPath参数作为第一个参数单独使用时,才有意义。

如果要构建字段的路径,则需要知道其全名。没有通配符或替代。但这甚至不是您所需要的。

我认为您具有此数据结构的方式不会满足查询的需求。听起来您需要一个特殊字段,该字段仅包含要在文档中定位的标签的ID。您可以通过简单地添加一个新的列表类型字段来做到这一点,该字段包含存在的文档ID标记字符串。然后,您可以使用in query来确定文档ID是否存在于集合的任何文档中该字段中的某个位置。

因此,例如:

db
    .collection('elements')
    .where('doc-tags', 'in', ["a element document id"])
    .get()

如果doc-tags是标签列表,则此查询将查找存在任何请求的ID的所有文档。

以上是关于在嵌套对象中使用firestore的FieldPath.documentId()的主要内容,如果未能解决你的问题,请参考以下文章

从 Firestore 中检索嵌套对象并放入 Android 中的 RecyclerView?

在 Firestore REST API 中查询嵌套对象

如何在firestore中查询嵌套对象[重复]

使用 AngularFire 和 Firestore 使用 Ng2 智能表显示嵌套对象

Firestore - 嵌套查询

更新firestore文档中嵌套对象中的字段?