Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将具有动态id的文档保存到Cloud Firestore中?不断变化_Javascript_Google Cloud Firestore_Add - Fatal编程技术网

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

Javascript 如何将具有动态id的文档保存到Cloud Firestore中?不断变化,javascript,google-cloud-firestore,add,Javascript,Google Cloud Firestore,Add,我正在使用CloudFireStore作为我的数据库 这是我网页上的表单代码,它在我的云Firestore集合中创建了一个名为“eSequick”的新文档。那么,我如何编码它,使它总是加上数据库中文档数量的1呢?并对数据库中的文档数量设置限制 form.addEventListener('submit', (e) => { e.preventDefault(); db.collection('esequiz').add({ question: form.question.value

我正在使用CloudFireStore作为我的数据库 这是我网页上的表单代码,它在我的云Firestore集合中创建了一个名为“eSequick”的新文档。那么,我如何编码它,使它总是加上数据库中文档数量的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的代码进行游戏,这里是最后的代码。非常感谢安德烈

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
        });
    });
    });

我不认为你试图得到的收集长度的方式是正确的,我完全不知道什么是最好的方式来获得这一点。因为当您试图读取集合的所有记录时,您尝试实现的方法将花费您更多的成本

但是可以有其他方法来获得你需要的号码

  • 开始将ID存储在记录中,并使用limit 1进行查询,并对ID进行降序排序
  • 将最新的编号存储在另一个集合中,并在每次创建新记录时递增该编号,并在需要时获取该编号

  • 如果在没有事务的情况下发出并发请求,这些方法可能会失败。

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

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

    我从两个不同的角度来看:

    方法1: 您可以有一个单独的文档来保存数据库的所有信息以及下一个名称

    e、 g

    因此,过程如下:

  • 读取文档“/eSequick/0”计为1次读取
  • 创建ID为的新文档:
    last_document+1
    计为1次写入
  • 更新保存信息的文档:
    last\u document=3计为1次写入
  • 这种方法需要对数据库进行1次读取和2次写入

    方法2: 您只能从数据库加载最后一个文档并获取其ID

    e、 g

    因此,过程如下:

  • 使用文档中描述的方法阅读最后一份文档。因此,您可以使用
    direction=firestore.Query.DESCENDING
    limit(1)
    组合,这将为您提供最后一个文档计为1读
  • 现在您知道了加载的文档的ID,因此可以创建ID为的新文档,该ID将使用加载的值并将其增加1计为1次写入
  • 这种方法总共需要对数据库进行1次读取和1次写入


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

    因此,让我们用上述逻辑制作一个简单的app.js:<
    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"
    
    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