我正在使用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]
更新:最终解决方案
尝试使用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次写入。随着数据库的增加,它将继续进行。
我看到的方式来自两种不同的方法:
您可以有一个文档,其中包含数据库的所有信息以及名称的别名。
例如
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"
因此,该过程将如下所示:
last_document + 1
为1 WRITElast_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"
因此,该过程将如下所示:
direction=firestore.Query.DESCENDING
与limit(1)
最后一个文档结合使用。算作1读这种方法总共花了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与上述逻辑一起工作:
$ gcloud auth login
Y
然后按Enter$ gcloud config set project PROJECT_ID
。现在,您可以构建一个简单的app.js脚本并执行它。nano app.js
node app.js
错误:找不到模块'@ 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方面遇到任何问题,则可以提出另一个问题。之后,您可以将这两种解决方案结合起来,然后您将可以使用应用程序!
祝好运!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句