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

我正在使用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在此处输入图片说明

来自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]

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

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

我认为这是因为我确实指定将文档ID作为值拉出,我该怎么做? 在此处输入图片说明

更新:最终解决方案

尝试使用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
        });
    });
    });
安德烈·库斯尼尔(Andrei Cusnir)

如果我正确理解,您正在向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"

因此,该过程将如下所示:

  1. 读取文档“ / esequiz / 0”计为1 READ
  2. 创建具有ID的新文档:记last_document + 1 为1 WRITE
  3. 更新包含该信息的文档:记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"

因此,该过程将如下所示:

  1. 使用订购和使用Cloud Firestore文档限制数据中描述的方法阅读最后一个文档。因此,您可以将其direction=firestore.Query.DESCENDINGlimit(1)最后一个文档结合使用算作1读
  2. 现在您知道了已加载文档的ID,因此可以使用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与上述逻辑一起工作:

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

    错误:找不到模块'@ google-cloud / firestore'

由于我们正在导入库,@google-cloud/firestore但尚未安装。

  1. 安装@google-cloud/firestore库如下:$ npm i @google-cloud/firestoreDOC中描述
  2. 再次执行脚本:$ node app.js
  3. 你应该看到例如 Document with ID: 3 is written.
  4. 如果再次执行,应该看到例如 Document with ID: 4 is written.

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

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

祝好运!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何模拟不断变化的课程?

来自分类Dev

如何将Cloud Firestore中的单个文档字段保存到Flutter中的局部变量中?

来自分类Dev

UITablieview具有不断变化的价值

来自分类Dev

禁用触摸板-ID不断变化

来自分类Dev

不断检查日期是否有变化

来自分类Dev

如何使我的收藏图标不断变化?

来自分类Dev

如何定义不断变化的范围名称?

来自分类Dev

如何将域指向不断变化的IP?

来自分类Dev

如何修复不断变化的约束和动态 UITableviewCell 高度?

来自分类Dev

如何根据不断变化的值列表动态创建表单

来自分类Dev

在python循环中具有不断变化的变量

来自分类Dev

如何将不断变化的stderr附加到文件或stdout

来自分类Dev

如何保存变量不断变化的当前值?

来自分类Dev

如何保存变量不断变化的当前值?

来自分类Dev

如何将文本文档中不断变化的(动态)字符串插入到.conkyrc中作为图像路径

来自分类Dev

如何将具有文档ID的自定义对象设置为扑扑中的Firestore中的集合?

来自分类Dev

在 Cloud Firestore 中,如何添加具有显式文档 ID 的文档

来自分类Dev

目标C文档目录在设备上不断变化

来自分类Dev

保存一个不断变化的变量的实例

来自分类Dev

在 Android 应用程序中保存不断变化的分数

来自分类Dev

进程id不断变化,不能用name杀死

来自分类Dev

如何观察Ember中不断变化的查询参数?

来自分类Dev

如何使用Selenium从网站上获得不断变化的价值

来自分类Dev

如何使用jQuery使div标签的背景颜色不断变化?

来自分类Dev

iOS Compass App:位置坐标不断变化。如何稳定呢?

来自分类Dev

如何从不断变化的对象列表中获取组件?

来自分类Dev

表列不断变化时如何使用Select INTO语句?

来自分类Dev

如何在 AlertDialog 中添加不断变化的 EditText 对象数量

来自分类Dev

如何正确将DateTime保存到Cloud Firestore

Related 相关文章

  1. 1

    如何模拟不断变化的课程?

  2. 2

    如何将Cloud Firestore中的单个文档字段保存到Flutter中的局部变量中?

  3. 3

    UITablieview具有不断变化的价值

  4. 4

    禁用触摸板-ID不断变化

  5. 5

    不断检查日期是否有变化

  6. 6

    如何使我的收藏图标不断变化?

  7. 7

    如何定义不断变化的范围名称?

  8. 8

    如何将域指向不断变化的IP?

  9. 9

    如何修复不断变化的约束和动态 UITableviewCell 高度?

  10. 10

    如何根据不断变化的值列表动态创建表单

  11. 11

    在python循环中具有不断变化的变量

  12. 12

    如何将不断变化的stderr附加到文件或stdout

  13. 13

    如何保存变量不断变化的当前值?

  14. 14

    如何保存变量不断变化的当前值?

  15. 15

    如何将文本文档中不断变化的(动态)字符串插入到.conkyrc中作为图像路径

  16. 16

    如何将具有文档ID的自定义对象设置为扑扑中的Firestore中的集合?

  17. 17

    在 Cloud Firestore 中,如何添加具有显式文档 ID 的文档

  18. 18

    目标C文档目录在设备上不断变化

  19. 19

    保存一个不断变化的变量的实例

  20. 20

    在 Android 应用程序中保存不断变化的分数

  21. 21

    进程id不断变化,不能用name杀死

  22. 22

    如何观察Ember中不断变化的查询参数?

  23. 23

    如何使用Selenium从网站上获得不断变化的价值

  24. 24

    如何使用jQuery使div标签的背景颜色不断变化?

  25. 25

    iOS Compass App:位置坐标不断变化。如何稳定呢?

  26. 26

    如何从不断变化的对象列表中获取组件?

  27. 27

    表列不断变化时如何使用Select INTO语句?

  28. 28

    如何在 AlertDialog 中添加不断变化的 EditText 对象数量

  29. 29

    如何正确将DateTime保存到Cloud Firestore

热门标签

归档