【问题标题】:Firestore find documents with particular object in an object array fieldFirestore 在对象数组字段中查找具有特定对象的文档
【发布时间】:2019-07-19 00:46:15
【问题描述】:

我正在尝试查询我的 firestore 数据库以查找集合中包含数组字段中的某个对象的所有文档。所以说我的数据库有一个这样的文章集合:

articles:
  [
    {
      id: "1",
      title: "First Article",
      comments:[]
      relatedArticles:[
        {
          id: "2",
          title:"Second Article"
        },
        {
          id: "3",
          title:"Third Article"
        },
      ]
    },
    {
      id: "2",
      title: "Second Article",
      comments:[]
      relatedArticles:[
        {
          id: "1",
          title:"First Article"
        }
      ]
    }
    {
      id: "3",
      title: "Third Article",
      comments:[]
      relatedArticles:[
        {
          id: "1",
          title:"First Article"
        }
      ]
    }
  ]

articles 集合中的每篇文章都有一个数组字段 (relatedArticles),其中包含一组对象,每个对象都包含相关文章的 id 和标题。假设我想在数据库中查询相关文章字段中包含文章 1 的所有文章。假设无法修改此结构,我将如何处理。我尝试了以下方法无济于事:

firestore().collection("articles")
  .where("relatedArticles", "array-contains", {title: "First Article", id: "1"})

这可行吗?如果不是,那是什么?

【问题讨论】:

  • 您尝试过您提出的查询吗?因为,如果我没记错的话,这正是你应该这样做的方式!见stackoverflow.com/questions/54081799/…
  • 我有,它不会返回任何东西。
  • 您确定 articles 是 Firestore 集合而不是数组吗?
  • @RenaudTarnec 是的,文章绝对是一个数据库集合。建议的方法是否有任何警告?例如,在查询或数据库记录中,属性的顺序是否重要(标题前的 id 与 id 前的标题)?
  • “属性的顺序是否重要” -> 我不知道,我从未尝试过。如果您反转对象元素/属性,它是否有效?

标签: typescript firebase google-cloud-firestore


【解决方案1】:

在进行包含数组的搜索时,您只能匹配数组中对象的整个元素。您无法像现在尝试那样在数组中挑选出更深层次的对象。

如果您想满足这个查询,您将需要文档中的其他一些可搜索的字段。也许一组仅相关的文档 ID 对您有用。像这样在 NoSQL 数据库中复制数据以满足查询的情况很常见。

【讨论】:

  • 那么,正如其他评论者所建议的那样,匹配数组中的整个对象不起作用?像这样:firestore().collection("articles") .where("relatedArticles", "array-contains", {title: "First Article", id: "1"})
  • 可以匹配整个对象。您必须提供一个在结构上与数组中的对象相同的对象。但是看起来您的数组项目相当大,这是需要提前了解的大量信息。您不能在顶级字段数组(例如relatedArticles)中单独挑选出嵌入式数组。您只能搜索顶级字段数组。
  • 结构上相同,您的意思是相同的属性和属性的排序/顺序?还是属性的顺序无关紧要?
  • 顺序无关紧要,因为 JSON 字段必须是唯一的;普通哈希表没有键顺序。
  • 然后您可以搜索相关文章以获取确切内容。您必须同时提供 id 和 title 才能使其正常工作。
猜你喜欢
  • 2012-07-13
  • 2023-04-08
  • 2021-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-26
  • 1970-01-01
相关资源
最近更新 更多