在嵌套对象中使用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?