如何将具有动态 ID 的文档保存到 Cloud Firestore 中?总是在变化

2024-01-23

我使用 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 = '';
});

It currently works but it will show up as an auto generated ID. How do I make it carry on from the numbers, like as my current documents? When i save I would like it to read the current last document id, OR simply count the number of documents, then just + 1 enter image description here

Andrei Cusnir 的见解是,不支持对 Cloud Firestore 中的文档进行计数。

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

UPDATED

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]

I think it is because I did specify to pull the document id as the value, how do I do so? enter image description here

更新:最终解决方案

尝试了 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 次写入。随着数据库的增加,它会继续下去。

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

方法一:

您可以有一个文档来保存数据库的所有信息以及下一个名称应该是什么。

e.g.

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 读
  2. 使用 ID 创建新文档:last_document + 1 计为 1 次写入
  3. 更新包含信息的文档:last_document = 3; 计为 1 次写入

这种方法需要对数据库进行 1 次读取和 2 次写入。

方法2:

您可以仅从数据库加载最后一个文档并获取其 ID。

e.g.

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 订购和限制数据 https://firebase.google.com/docs/firestore/query-data/order-limit-data文档。所以你可以使用direction=firestore.Query.DESCENDING与组合limit(1)这将为您提供最后一份文件。计为 1 读
  2. 现在您知道了加载文档的 ID,因此您可以使用 ID 创建新文档:它将使用加载的值并将其增加 1。计为 1 次写入

这种方法总共需要对数据库进行 1 次读取和 1 次写入。


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

UPDATE

为了进行排序,您还必须将 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 来生成新文档的名称!

UPDATE 2

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

因此,让我们使用上面描述的逻辑创建一个简单的 app.js:

  1. 由于您的 Cloud Firestore 已经在运行,这意味着您已经拥有 Google Cloud Platform 项目(Firestore 所依赖的地方)并且已启用适当的 API。否则它不会工作.
  2. 本教程中的指南是Cloud Firestore:Node.js 客户端 https://googleapis.dev/nodejs/firestore/latest/文档。它将帮助您了解可与 Firestore Node.js API 一起使用的所有方法。您可以找到用于添加、阅读、查询文档和许多其他操作的有用链接。 (我将在此步骤的后面发布完整的工作代码。我刚刚分享了链接,以便您知道在哪里寻找其他功能)
  3. Go to Google Cloud 控制台仪表板 https://console.cloud.google.com/home/dashboard页。您应该使用设置了 Firestore 数据库的项目的 Google 帐户登录。
  4. 在右上角,您应该会看到 4 个按钮和您的个人资料图片。第一个按钮是激活 Cloud Shell。这将在页面底部打开一个终端,其中已安装 Linux 操作系统和 Google Cloud SDK。在那里,您可以与 GCP 项目中的资源进行交互,并在本地测试您的代码,然后再在项目中使用它。
  5. 单击该按钮后,您会注意到终端将在页面底部打开。
  6. 为了确保您得到正确的身份验证,我们将设置项目并再次验证帐户,即使默认情况下已经完成。所以首先执行$ gcloud auth login
  7. 在提示的问题类型上Y然后按回车键
  8. 单击生成的链接并在提示窗口中验证您的帐户
  9. 将生成的字符串复制回终端并按 Enter 键。现在您应该已通过正确的身份验证。
  10. 然后使用以下命令设置包含 Cloud Firestore 数据库的项目:$ gcloud config set project PROJECT_ID。现在您已准备好构建一个简单的 app.js 脚本并执行它。
  11. 创建一个新的 app.js 文件:nano app.js
  12. 里面粘贴我的代码示例,可以在这里找到GitHub 链接 https://github.com/andrikosrikos/Google-Cloud-Support/blob/master/Firestore/Node.js/create_document_with_incremental_id.js。它包含完整的工作示例和许多解释每个部分的注释,因此最好通过 GitHub 链接共享,而不是粘贴到此处。无需进行任何修改,此代码将准确执行您想要执行的操作。我自己测试过它并且有效。
  13. 执行脚本如下:node app.js
  14. This will give you the following error:

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

由于我们正在导入库@google-cloud/firestore但还没有安装。

  1. Install @google-cloud/firestore库如下:$ npm i @google-cloud/firestore。描述于DOC https://www.npmjs.com/package/@google-cloud/firestore.
  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 的任何问题,那么您可以提出另一个问题。之后,您可以结合这两种解决方案,您将拥有可以运行的应用程序!

祝你好运!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将具有动态 ID 的文档保存到 Cloud Firestore 中?总是在变化 的相关文章

  • 将 Javascript 对象的属性从 string 更改为 int

    我有一个对象数组 每个对象具有三个属性 年份 总计 人均 例子 0 Object per capita 125 8 total 1007 2 year 2009 这些属性是字符串 我想创建一个循环来遍历数组并将它们转换为 int 我尝试了以
  • 使用本地存储在从另一个表保存的 HTML TABLE 中打印 JSON,以便我在另一个页面上打印我的表

    在我的作业中 我必须使用用户输入中的数据并将数据保存在本地存储中 我必须以水平表格式将这些数据从本地存储打印到其他页面 为此 我编写了用于用户输入并将数据保存在本地存储中的代码 div p p div
  • Firebase,只得到新的孩子[重复]

    这个问题在这里已经有答案了 var firebase new Firebase firebaseRef on child added function snapshot 这将接收所有元素 有没有办法在创建新的 Firebase 引用时不接收
  • jQuery .push 到 .get 调用中的数组给出空结果

    谁能告诉我为什么下面给我一个空字符串 当我console log contentArray in the get 回调函数它显示数据 但是当我尝试在下面的代码中执行它时 结果为空 sectionArray contentArray func
  • .push() 将多个对象放入 JavaScript 数组中返回“未定义”

    当我将项目添加到beats数组然后console log用户时 我得到了数组中正确的项目数 但是当我检查 length 时 我总是得到 1 尝试调用索引总是会给我 未定义 如下所示 Tom beats 1 我想我错过了一些明显的东西 但这让
  • 在版本 4.4.6 中禁用 ckeditor 上下文菜单

    我在 Rails4 项目中使用 ckeditor 我尝试了 ckeditor gem 和 ckeditor rails gem 来提供 ckeditor 库 这里有多个帖子 人们希望删除 ckeditor 上下文菜单 以便可以显示本机浏览器
  • 导航栏下拉菜单(折叠)在 Bootstrap 5 中不起作用

    我在尝试使用以下命令创建响应式菜单或下拉按钮时遇到问题Bootstrap 5一切似乎都正常 导航图标和下拉图标出现 但它不起作用 当我单击nav图标或dropdown按钮 无dropdown menu apears 我想特别提到的是 我还包
  • JavaScript 继承;调用和原型

    要在Javascript中实现继承 通常需要执行以下两个步骤 假设我有一个基类 Animal var Animal function name this name name 我现在想从中派生一个子类 Dog 所以我想说 var Dog fu
  • 如何通过单击链接来更改 div 的内容?

    这是我的网页的 修改后的 jsfiddle 它还有很多 而且定位是正确的 与此相反 http jsfiddle net ry0tec3p 1 http jsfiddle net ry0tec3p 1 a href class btn1 st
  • JavaScript 中的 Promise 有什么意义?

    一个承诺是一个 可能现在可用 或将来可用 或永远不可用的值 来源 MDN 假设我有一个想要处理图片的应用程序 图片已加载 例如在算法在后台使用它之后 或某种其他类型的延迟 现在我想检查一下图片是否可以在future 通过使用承诺 而不是回调
  • onclick 事件中未调用函数

    我想在每个 YouTube 链接的末尾添加一些 HTML 以在 litebox 中打开播放器 到目前为止 这是我的代码 document ready function var valid url new RegExp youtube com
  • 如何在另一个自定义 Hook 中使用返回值的自定义 Hook?

    我正在使用 React native 其中有一个名为的自定义 HookuseUser使用以下方法从 AWS Amplify 获取用户信息Auth getUserInfro方法 然后获取返回对象的一部分并用它设置一个状态变量 我还有另一个名为
  • mongodb 聚合 - 累积字段的不同组值

    如果我有Player表格文件 name String score Int 我有Group文档 其中组代表玩家列表 groupName String players ObjectID 玩家可以属于多个组 我想做一个聚合Player文档 按以下
  • 使用 JavaScript 移动页面上的按钮

    我的按钮可以移动 但奇怪的是 我无法弄清楚偏移是否有问题 我希望我的按钮随着鼠标光标移动 但现在它的移动方式不是我想要的 有时它会消失 另外 创建的新按钮是重叠的 我不知道如何解决这个问题并拥有更好的外观 var coorA var coo
  • LeafleteachLayer函数不会迭代所有Layer

    使用 GeoJSON 数据数组创建一些标记 getJSON GetLocationsServlet function data L geoJSON data onEachFeature onEachFeature addTo mymap G
  • 用于选择特定 div 中具有特定类的锚元素的 jQuery 选择器是什么

    我有一些这样的代码 我想选择每个 a 带有类的标签status在 div 中foo div a class status a div 你可以这样做 foo find status a
  • 主页(网格)上的缩略图现在显得模糊。如何纠正?

    我不知道这看起来是否愚蠢 但从早上开始我就无法纠正这个突然出现在我的博客网站上的错误www candidopinions in http www candidopinions in 我有一个网格视图模板 其中博客文章中的特色图像作为调整大小
  • 在 iOS 7 Safari 中,如何区分通过边缘滑动与后退/前进按钮的 popstate 事件?

    在 iOS 7 Safari 中 现在有两种后退 前进导航方式 使用底部的传统后退 前进按钮箭头或从屏幕边缘滑动 我正在使用动画在 ajax 应用程序中的页面之间进行转换 但如果用户通过边缘滑动进行导航 我不想触发该转换 因为这本身就是一个
  • 测量窗口偏移

    有没有一种方法可以测量 jQuery 中窗口的偏移量 以便我可以比较 固定 元素和相对定位元素的位置 我需要能够知道窗口滚动了多远 以便我可以使用该图来计算固定元素的高度 相对于视口顶部 和相对对象的高度 相对于顶部 之间的差异文件的内容
  • 使用velocity.js制作可拖动元素的动画

    我正在使用velocity js 为用户拖动的可拖动 SVG 元素设置动画 然而 velocity js 将先前的 mousemove 坐标排队并通过所有后续的 mousemove 坐标进行动画处理 我想要的是velocity js 不要对

随机推荐

  • Java 树表示路径列表中的文件系统(文件/目录)

    我有一个这样的路径列表 mnt sdcard folder1 a b file1 mnt sdcard folder1 a b file2 mnt sdcard folder1 a b file3 mnt sdcard folder1 a
  • 停止使用 Android 原生相机保存照片

    我正在使用本机 Android 相机并将文件保存到我的应用程序数据文件夹 mnt sdcard Android data com company app files Pictures 同时 照片的另一个副本将保存到 DCIM 文件夹中 这是
  • 如何在 Mac 上制作一个允许用户创建目录的 JFileChooser?

    我有一个安装程序 可以让用户选择安装目录 MacOS 上的 JFileChooser 实现使用本机对话框 或者至少看起来是本机的 那太棒了 唯一的问题是无法从此对话框中创建目录 您只能选择一个预先存在的目录 这很笨拙 有没有办法获得这个功能
  • 在 Asp.Net 中获取 jQuery Ajax 返回数据

    我是 jQuery 的新手 不明白 jQuery Ajax 如何返回数据 我有一些简单的函数来获取如下数据 WebMethod EnableSession false protected int SignIn return 0 在我的 as
  • 如何在delphi中将图标转换为具有alpha透明度的png?

    下面的代码将从文件中提取图标并将其转换为 png 但没有 alpha 透明度 var IconIndex word icon TIcon png TPngImage bmp TBitmap begin IconIndex 0 icon TI
  • C++ 二维 std::vector 最佳实践

    我正在构建一个应用程序 需要支持二维数组来保存数据网格 我有课Map包含二维数据网格 我想使用向量而不是数组 我想知道使用二维向量的最佳实践是什么 我应该有一个 MapCells 向量的向量吗 或者它应该是指向 MapCells 的指针向量
  • Docker echo 环境变量

    我正在尝试编写一个小 docker 文件来设置用户并仅回显当前用户作为一个小示例 以向自己证明它正在工作 我尝试了多种变体 但在文档中找不到太多帮助 FROM ubuntu USER daemon ENTRYPOINT echo USER
  • 在 Ubuntu 10.10 上安装 git-flow 无提示地失败

    我正在尝试使用 github 上的说明安装 gitflowreadme http github com nvie gitflow啦啦 wget q O https github com nvie gitflow raw develop co
  • 定义类模板的友元函数模板

    我想定义一个类模板的函数模板 代码如下所示 template
  • 如何在没有belongsTo的情况下处理Grails中的多对多?

    我需要在 Grails 中创建多对多关系 我有一个 问题 域和一个 标签 域 一个问题可以有 0 个或多个标签 一个标签可以有 0 个或多个问题 如果我在每一边都放一个 hasMany 它会给我一个错误 说我需要一个 belongTo 某处
  • 确定 github 页面上的页面已过时

    Github 页面 http pages github com 设置非常激进的缓存标头 Cache Control max age 86400 1 day Expires提前 1 个月 所有提供的内容 如果您更新页面并推送到 github
  • TryAcquireSRWLock* 和 _WIN32_WINNT

    根据文档 尝试获取SRWLockShared https technet microsoft com en us library dd405524 aspx and 尝试获取SRWLockExclusive https msdn micro
  • Windows 7 TextureBrush..ctor() 错误

    我有一个 NET 2 0 应用程序 在 XP 和 Vista 上运行得很好 但在 Windows 7 RC x64 上它崩溃并出现以下错误 异常信息 异常类型 System OutOfMemoryException 消息 内存不足 数据 S
  • Ruby 中的哈希“has_key”复杂性

    我有一个哈希vars a gt Name b gt Address c gt Phone 我想检查这条线的性能 vars has key b 是 O 1 还是 O 哈希大小 简单的基准 require benchmark iteration
  • 为什么我们在 .class 文件的开头需要一个幻数?

    我在这里读了一些关于神奇数字的帖子0xCAFEBABE在每个java的开头 class文件并想知道why它是需要的 这个标记的目的是什么 现在还需要吗 或者现在只是为了向后兼容 找不到回答这个问题的帖子 我也没有在 java 中看到答案sp
  • WebSocket 服务器的最佳实践是什么?

    假设您有一个网站 用户可以在其中打开聊天室 房间打开后 用户可以邀请其他人并聊天 我们还假设您想使用 WebSockets 与客户端进行通信 在大多数服务器端 WebSocket 实现中 都有一个简单的函数 例如connection bro
  • 如何防止Laravel路由被直接访问(即非ajax请求)

    在我的项目中 我纯粹使用 Laravel 作为后端 api 所有前端均由 Angular javascript 处理 目前 Laravel 路由可以直接访问 它会输出浏览器中显示的所有 Json 数据 我想对其进行限制 以便 Laravel
  • 将数据帧转换为 treeNetwork 兼容列表

    考虑以下数据框 Country Provinces City Zone 1 Canada Newfondland St Johns A 2 Canada PEI Charlottetown B 3 Canada Nova Scotia Ha
  • “转换”asp.net 形式为 html 形式

    我有一个 asp net 网络表单 用户在文本框中输入数据 我也这样做OnClick SubmitData 有一个按钮 现在我想使用 jquery 并使我的表单看起来更好 但我不知道是否可以保留 asp net 控件或是否必须转换为 htm
  • 如何将具有动态 ID 的文档保存到 Cloud Firestore 中?总是在变化

    我使用 Cloud Firestore 作为我的数据库 这是我网页上的表单代码 它在我的 Cloud Firestore 集合中创建一个名为 esequiz 的新文档 那么我该如何编码才能使其始终为数据库中的文档数加 1 呢 并设置数据库内