【问题标题】:Querying arrays within documents in Google Firestore [duplicate]在 Google Firestore 中的文档中查询数组 [重复]
【发布时间】:2021-10-17 07:24:34
【问题描述】:

我在一个集合中有一个文档,它有一个对象数组作为属性。

例如

Projects
   name: 'Great Project'
   members: [{id:'1', name:'rob']

我想获得所有以 rob 为成员的项目。

我希望这会奏效

collection("projects")
    .where("members.name", "array-contains", "rob")
   

...但是没有。

如您所见,我正在尝试获取 ID

我想我可以使用子集合,但我会遇到类似的问题。

我做错了什么!

而且,这是存储这些数据的最佳方式吗?

【问题讨论】:

    标签: node.js firebase google-cloud-firestore


    【解决方案1】:

    您的查询当前查找字段owners 是一个映射的文档,其中包含names 的字符串嵌套数组,其中包含rob。但是在您的示例文档中,包含对象数组的字段是members。要将 array-contains 与对象数组一起使用,您需要按原样传入完整的对象:

    const owner = {id: '1', name: 'rob'}
    
    const db = firebase.firestore()
    const projectsCol = db.collection("projects")
    
    const query = projectsCol.where("members", "array-contains", owner)
    

    话虽如此,您还需要知道对象中存在的id 字段。

    您可以将成员移动到子集合而不是数组并使用Collection Group 查询。数据库结构类似于:

    projects -> {projectId} -> members -> {memberId}
    

    members 子集合中的每个文档都类似于:

    {
      id: "1",
      name: "rob",
      ...otherFields
    }
    

    现在您可以对“members”运行集合组查询,该查询将返回名称为“rob”的所有文档,然后您可以使用 DocumentReference 对所有匹配的文档获取项目 ID。

    const query = firebase.firestore().collectionGroup("members").where("name", "==", "rob")
    
    query.get().then((snapshot) => {
      console.log(snapshot.docs.map(d => d.ref.parent.parent.id))
    })
    

    这应该记录 rob 是成员的项目的 ID。

    【讨论】:

    • 感谢您查看问题错字。你是对的 - 我需要将整个对象传递给 array-contains 子句。我必须在查询的末尾添加 .get() 才能获取快照,否则全部排序,谢谢。
    • @RobEllis 是的,需要get() 方法来获取文档。为了更好的可读性,我只是在下一行做了。 query.get()
    • 如果有人想在检索到 Dharmaraj 显示的 ID 后获取文档,您可以使用:await db.collection("projects").where(Firestore.FieldPath.documentId(), "in" , projectids).get();
    猜你喜欢
    • 2019-10-18
    • 1970-01-01
    • 2021-09-26
    • 2021-10-22
    • 1970-01-01
    • 2018-05-24
    • 2019-12-21
    相关资源
    最近更新 更多