javascript - 如何将具有动态ID的文档保存到Cloud Firestore?不断变化

标签 javascript google-cloud-firestore add

我正在使用Cloud Firestore作为数据库
这是我网页上的表单代码,可在Cloud Firestore集合中创建一个名为“esequiz”的新文档。那么,如何以始终将数据库中的文档数加1的方式对其进行编码?并设置数据库内部文档数量的限制

form.addEventListener('submit', (e) => {
e.preventDefault();
db.collection('esequiz').add({
    question: form.question.value,
    right: form.right.value,
    wrong: form.wrong.value
});
form.question.value = '';
form.right.value = '';
form.wrong.value = '';
});

目前可以使用,但会显示为自动生成的ID。我如何像我当前的文件那样继续使用数字?当我保存时,我希望它读取当前的最后一个文档ID,或者只是计算文档的数量,然后只需+ 1
enter image description here

来自Andrei Cusnir的数据分析不支持在Cloud Firestore中计数文档。

现在,我正在尝试Andrei的方法2,以降序查询文档,然后使用.limit仅检索第一个。

更新了
form.addEventListener('submit', (e) => {
e.preventDefault();
let query = db.collection('esequiz');
let getvalue = query.orderBy('id', 'desc').limit(1).get();
let newvalue = getvalue + 1;
db.collection('esequiz').doc(newvalue).set({
    question: form.question.value,
    right: form.right.value,
    wrong: form.wrong.value
});
form.question.value = '';
form.right.value = '';
form.wrong.value = '';
});

没有更多错误,而是下面的代码返回[object Promise]

let getvalue = query.orderBy('id', 'desc').limit(1).get();



因此,当我保存表单时,它另存为[object Promise] 1,我不知道为什么会这样。有人可以建议我如何返回文档ID值而不是[object Promise]

我认为这是因为我确实指定将文档ID作为值拉出,我该怎么做?
enter image description here

更新:最终解决方案

尝试使用Andrei的代码,这是有效的最终代码。非常感谢Andrei!
let query = db.collection('esequiz');
//let getvalue = query.orderBy('id', 'desc').limit(1).get();
//let newvalue = getvalue + 1;    
query.orderBy('id', 'desc').limit(1).get().then(querySnapshot => {
    querySnapshot.forEach(documentSnapshot => {
        var newID = documentSnapshot.id;
        console.log(`Found document at ${documentSnapshot.ref.path}`);
        console.log(`Document's ID: ${documentSnapshot.id}`);
        var newvalue = parseInt(newID, 10) + 1;
        var ToString = ""+ newvalue;
        db.collection('esequiz').doc(ToString).set({
            id: newvalue,
            question: form.question.value,
            right: form.right.value,
            wrong: form.wrong.value
        });
    });
    });

最佳答案

如果我正确理解,您正在向Cloud Firestore添加数据,每个新文档的名称都会有一个增量编号。

如果查询所有文档,然后计算其中有多少,那么随着数据库的增加,最终将读取许多文档。别忘了Cloud Firestore会按文件读写收取费用,因此,如果您有100个文件,并且要添加ID为101的新文件,那么先读取所有文件然后计算它们的方法将使您花费很多100次读取,然后1次写入。下次它将花费您101次读取和1次写入。随着数据库的增加,它将继续进行。

我看到的方式来自两种不同的方法:

方法1:

您可以有一个文档,其中包含数据库的所有信息以及名称的别名。

例如

The structure of the database:
esequiz:
        0: 
          last_document: 2
        1: 
          question: "What is 3+3?
          right: "6"
          wrong: "0"
        2: 
          question: "What is 2+3?
          right: "5"
          wrong: "0"

因此,该过程将如下所示:
  • 读取文档“/ esequiz / 0” 计为1 READ
  • 创建ID为:last_document + 1 的新文档记为1 WRITE
  • 更新包含该信息的文档:last_document = 3; 计为1 WRITE

  • 这种方法花费了1 READ和2写到数据库。

    方法二:

    您只能从数据库中加载最后一个文档并获取其ID。

    例如
    The structure of the database (Same as before, but without the additional doc):
    esequiz:
            1: 
              question: "What is 3+3?
              right: "6"
              wrong: "0"
            2: 
              question: "What is 2+3?
              right: "5"
              wrong: "0"
    

    因此,该过程将如下所示:
  • 使用Order and limit data with Cloud Firestore文档中描述的方法阅读最后一个文档。因此,您可以将direction=firestore.Query.DESCENDINGlimit(1)结合使用,这将为您提供最后的文档。 计为1个READ
  • 现在您知道已加载文档的ID,因此可以创建具有ID的新文档:将使用已加载的值并将其增加1。计为1 WRITE

  • 这种方法总共花了1 READ和1 WRITE到数据库。

    希望这些信息对您有所帮助,并且可以解决您的问题。目前不支持Cloud Firestore中的文档计数。

    更新

    为了使排序有效,您还必须将id包含在文档的字段中,以便可以基于它进行排序。我已经测试了以下示例,它对我有用:

    数据库结构:
    esequiz:
            1: 
              id: 1
              question: "What is 3+3?
              right: "6"
              wrong: "0"
            2: 
              id:2
              question: "What is 2+3?
              right: "5"
              wrong: "0"
    

    如您所见,该ID设置为与文档ID相同。

    现在,您可以查询所有文件和基于该文件的订单。同时,您只能从查询中检索最后一个文档:
    const {Firestore} = require('@google-cloud/firestore');
    const firestore = new Firestore();
    
    async function getLastDocument(){
    
        let query = firestore.collection('esequiz');
    
        query.orderBy('id', 'desc').limit(1).get().then(querySnapshot => {
        querySnapshot.forEach(documentSnapshot => {
            console.log(`Found document at ${documentSnapshot.ref.path}`);
            console.log(`Document's ID: ${documentSnapshot.id}`);
        });
        });
    
    }
    
    OUTPUT:
    Found document at esequiz/2
    Document's ID: 2
    

    然后,您可以获取ID并将其增加1以生成新文档的名称!

    更新2

    因此,最初的问题是关于“如何使用具有增量ID的文档在Cloud Firestore中存储数据”,目前您正面临在项目中设置Firestore的问题。不幸的是,应该在另一个Stackoverflow帖子中讨论新提出的问题,因为它们与为文档增加ID的逻辑无关,并且最好每个问题保留一个问题,以便为正在寻找的成员提供更好的社区支持对于特定问题的解决方案。因此,在本文中,我将尝试帮助您执行一个简单的Node.js脚本并解决最初的问题,该问题将使用增量ID存储到Cloud Firestore文档中。其他有关如何在项目中进行设置以及如何在页面中具有此功能的问题,都应该在其他问题中解决,在该问题中,您还需要提供尽可能多的有关所使用框架,项目设置的信息。等等

    因此,让一个简单的app.js与上述逻辑一起工作:
  • 由于您已经可以使用Cloud Firestore,这意味着您已经拥有Google Cloud Platform项目(Firestore依赖于该项目)并且已经启用了正确的API。否则它将无法正常工作。
  • 本教程中的指南是Cloud Firestore: Node.js Client文档。它将帮助您了解可与Firestore Node.js API一起使用的所有方法。您可以找到有用的链接来添加,阅读,查询文档以及更多操作。 (我将在此步骤的稍后部分中发布整个工作代码。我只是共享了链接,所以您知道在哪里可以找到其他功能)
  • 转到Google Cloud Console Dashboard页面。您应该使用设置了Firestore数据库的项目的Google帐户登录。
  • 在右上角,您应该看到4个按钮和您的个人资料图片。第一个按钮是激活Cloud Shell 。这将在页面底部打开一个终端,该终端已安装linux OS和Google Cloud SDK。在那里,您可以与GCP项目中的资源进行交互,并在项目中使用代码之前在本地测试代码。
  • 单击该按钮后,您会注意到终端将在页面底部打开。
  • 为确保您已正确通过身份验证,我们将设置项目并再次对帐户进行身份验证,即使默认情况下已完成也是如此。所以先执行$ gcloud auth login
  • 在提示的问题上,键入Y并按Enter键
  • 单击生成的链接,然后在提示的窗口中对您的帐户进行身份验证
  • 将生成的字符串复制回终端,然后按Enter。现在,您应该已正确认证。
  • 然后使用以下命令设置包含Cloud Firestore数据库的项目:$ gcloud config set project PROJECT_ID。现在,您可以构建一个简单的app.js脚本并执行它。
  • 创建一个新的app.js文件:nano app.js
  • 在内部粘贴我的代码示例,可以在此GitHub link中找到它。它包含一个完整的示例,并包含许多解释每个部分的注释,因此最好通过GitHub链接进行共享,而不是粘贴在此处。无需进行任何修改,此代码将完全执行您要执行的操作。我已经对其进行自我测试,并且可以正常工作。
  • 执行脚本为:node app.js
  • 这将给您以下错误:

    Error: Cannot find module '@google-cloud/firestore'


  • 由于我们正在导入库@google-cloud/firestore,但尚未安装它。
  • 如下安装@google-cloud/firestore库:$ npm i @google-cloud/firestore。在DOC中描述。
  • 再次执行脚本:$ node app.js
  • 您应该看到例如Document with ID: 3 is written.
  • 如果再次执行,则应看到例如Document with ID: 4 is written.

  • 所有这些更改也应显示在您的Cloud Firestore数据库中。如您所见,它正在加载最后一个文档的ID,它正在创建一个新ID,然后使用给定的参数创建一个新文档,同时使用新生成的ID作为文档名称。这正是最初的问题所在。

    因此,我已经与您分享了完整的代码,该代码可以正常工作,并且完全可以满足您的要求。不幸的是,其他新提出的问题应该在另一个Stackoverflow帖子中解决,因为它们与最初的问题“如何创建具有增量ID的文档”无关。我建议您按照以下步骤操作并使用一个有效的示例,然后尝试对您的项目实现逻辑。但是,如果您仍在如何在项目中设置Firestore方面遇到任何问题,则可以提出另一个问题。之后,您可以将这两种解决方案结合起来,然后您将可以使用应用程序!

    祝好运!

    关于javascript - 如何将具有动态ID的文档保存到Cloud Firestore?不断变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59857586/

    相关文章:

    javascript - 我正在尝试复制这个图像轮播,但我遇到了样式问题

    javascript - 使用 JavaScript 从 CSOM 添加、更新和查询 SharePoint 列表项

    python - Python 在列表中添加元素

    javascript - 用 Observable 替换中间件模式(取消订阅?)

    javascript - 使用#跳转到位置+增量

    javascript - 如何使用 Javascript 调整 Iframe 的宽度?

    firebase - Firestore查询流与获取之间的区别?

    node.js - 等待 firestore 查询完成,然后返回云函数响应

    android - 如何使用云功能向具有 FCM token 的多个设备发送推送通知

    android - 在 ANDROID 布局中动态添加 TextView