Javascript Firestore-从文档中获取特定字段 我需要的是:

Javascript Firestore-从文档中获取特定字段 我需要的是:,javascript,firebase,google-cloud-firestore,Javascript,Firebase,Google Cloud Firestore,我想在Firestore中保存文章或注释及其各自的字段: 头衔 内容(文本或段落) 创建日期 所有者(与其他人共享该物品) 可以对其进行编辑的人员和人员,如:) 但当我显示文章列表时,我不需要“内容”字段(以节省带宽)。我读过(也许我错了),不可能通过Firestore查询只从文档中获取特定字段 如果从文章中获取特定列(不包含其内容)是正常的SQL,则类似于: SELECT title, creation_date, ... FROM table_name; 因此,我选择将两个根级集合的内

我想在Firestore中保存文章或注释及其各自的字段:

  • 头衔
  • 内容(文本或段落)
  • 创建日期
  • 所有者(与其他人共享该物品) 可以对其进行编辑的人员和人员,如:)
但当我显示文章列表时,我不需要“内容”字段(以节省带宽)。我读过(也许我错了),不可能通过Firestore查询只从文档中获取特定字段

如果从文章中获取特定列(不包含其内容)是正常的SQL,则类似于:

SELECT title, creation_date, ...
FROM table_name;
因此,我选择将两个根级集合的内容分开(为了灵活性和可伸缩性)


我目前的结构: 文章集:

  - `articles` [collection]
    - `ARTICLE_ID` [document]
      - `creatorId` [field]
      - `title` [field]
      - `date` [field]
      - `owners` [obj field]
          - {user1_id}: true
          - {user2_id}: true
          ...
  - `contents` [collection]
    - `{ARTICLE_ID}` [document]
      - `content` [field]
目录集:

  - `articles` [collection]
    - `ARTICLE_ID` [document]
      - `creatorId` [field]
      - `title` [field]
      - `date` [field]
      - `owners` [obj field]
          - {user1_id}: true
          - {user2_id}: true
          ...
  - `contents` [collection]
    - `{ARTICLE_ID}` [document]
      - `content` [field]
要实时获取文章列表,请执行以下操作:

firebase.firestore().collection('articles')
  .where(`owners.${user.uid}`, '==', true)
  .onSnapshot(querySnapshot => {
    const articles = []
    querySnapshot.forEach((doc) => {
      articles.push({
        id: doc.id,
        ...doc.data()
      })
    })
    // do something with articles array
  })
要在另一个视图中显示并获取整篇文章及其内容,请执行以下操作:

const db = firebase.firestore()
const articleRef = db.collection('articles').doc(articleId)
const contentRef = db.collection('contents').doc(articleId) // same Id as article

articleRef.get().then(articleDoc => {
  if (articleDoc.exists) {
    contentRef.get().then(contentDoc => {
      if (contentDoc.exists) {
        const article = {
          ...articleDoc.data(),
          ...contentDoc.data()
        }
        // full article obj
      }
    })
  } 
})

我的问题
  • 您认为最好同时执行两个查询(getArticle和getContent),并使用Promise.all()等待,而不是像我一样嵌套查询

  • 有没有更好的方法通过一次查询或更高效地获取文章及其内容?一些提示或想法


提前非常感谢

Firebase主机将是静态内容(如文章)的最佳选择。例如,如果您看一看,它们非常适合极快的页面加载,并突出了边缘缓存的好处。Firebase主机是


Firestore和Firebase实时数据库是数据库引擎。这些都不是提供文章的合适工具。

两种方法都不比另一种好。但有几个关键区别

  • 嵌套读取时,第二次只读将在第一次读取完成后开始。使用
    Promise.all()
    时,两个读取同时启动,因此可以(部分)并行运行

  • 另一方面:当您使用
    Promise.all()
    时,您的完成处理程序(您在
    then()
    中运行的代码)将在两个文档都加载后才会执行。如果嵌套调用,则可以在加载第一个文档后更新UI

  • 最终,差异可能很小。但是,由于它们可能对您的用例很重要,请测量结果,看看什么最适合您。

    根据文档,您应该能够选择所需的字段

    let collectionRef = firestore.collection('col');
    let documentRef = collectionRef.doc('doc');
    
    return documentRef.set({x:10, y:5}).then(() => {
      return collectionRef.where('x', '>', 5).select('y').get();
    }).then((res) => {
      console.log(`y is ${res.docs[0].get('y')}.`);
    });
    

    您当前的代码有什么问题?@FrankvanPuffelen我已经改进了解释。代码工作正常。我对把事情做好只有存在主义的怀疑。喜欢“存在主义的怀疑”的评论brillantIn在UI中,我会显示一个加载图标,直到我从两个查询(文章及其内容)中获得数据为止。因此,我认为最好将它们与Promise.all()并行使用。我将尝试两种方法中的哪一种更快/更有效。谢谢!:)我想这只适用于Google Cloud和Node.js包:PIs有可能有两个或更多字段吗?@harshadnarkhede Yep,用逗号分隔你想要的任何列名列表。界面是
    select(…field:| string | FieldPath)[])
    ,例如:
    select('field1','field2','other_field','and-a-fourth')
    。谢谢!但这不仅仅是针对文章。这是给便条和其他东西的,呵呵:)我明白了。原来的问题变了。希望我能为你节省一些时间。。。说真的,文章应该是静态的,带有一个静态URL。这并不是说一些
    内容在主菜上桌后无法加载。对不起,也许我用“文章”这个词让你有点困惑。我称之为私人票据。只有您才能在仪表板中看到您的笔记及其标题和内容(wysiwyg)。稍后我将在其中添加并与其他用户共享它们。不过还是要谢谢你!=)无论是一篇文章还是一篇笔记,在这里都无关紧要:-)