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

问题描述 投票:0回答:1

这是我的数据的结构:

“

因此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()

有什么想法吗?

typescript firebase google-cloud-firestore
1个回答
0
投票

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的所有文档。

© www.soinside.com 2019 - 2024. All rights reserved.