英文:
Firebase batch write non-existent top-level collections
问题
在我的Vue3 + Firebase Web应用中,我有一个上传包含学校学生信息的.csv文件的功能。
文件被读取并保存到一个对象中。
这个.csv表的每一行都有一个名为“courseName”的列。
通过点击一个按钮,我有一个函数,它使用一个for循环和Firebase批量写入来将.csv写入到Firestore中。
“courseName”列很重要,因为我的Firestore结构如下:
schools/someID/courses/courseName/students/
该函数循环遍历.csv文件,并将行添加到批量写入中。当courseName更改时,提交批处理、清除批处理,并继续为共享相同courseName的下一个学生创建新的批处理。
批量写入本身的逻辑如下所示:
const pathRef = doc(db, "schools/" + userInfoStore.userInfo?.schoolID + '/courses/' + currentCourse + '/students/' + val[columnNames.value.UID])
const data = {
vorname: val[columnNames.value.Vorname],
nachname: val[columnNames.value.Nachname],
klasse: val[columnNames.value.Klasse],
uid: val[columnNames.value.UID]
}
batch.set(pathRef, data)
这个方法可以工作,但它会在数据库中留下名为“currentcourse”的集合,意味着它本身并不存在,并且无法在Firestore查询中找到。
我该如何防止这种情况发生?
英文:
In my Vue3 + Firebase Web-App i have an upload for a .csv that contains students of a school.
The file is read and saved to an object.
Each row of this .csv table has a column called "courseName".
With the click of a button i have a function that uses a for-loop and
firebase batch writing to write the .csv to firestore.
The "courseName" column is important as my firestore structure looks as follows:
schools/someID/courses/courseName/students/
The function loops through the .csv and adds the lines to a batch write. When courseName changes, the batch is committed, cleared and proceeds to make a new batch for the next students who share the same courseName.
The logic for the batch writing itself looks as follows:
const pathRef = doc(db, "schools/" + userInfoStore.userInfo?.schoolID + '/courses/' + currentCourse + '/students/' + val[columnNames.value.UID])
const data = {
vorname: val[columnNames.value.Vorname],
nachname: val[columnNames.value.Nachname],
klasse: val[columnNames.value.Klasse],
uid: val[columnNames.value.UID]
}
batch.set(pathRef, data)
This works, however it leaves the collection with the name of "currentcourse" in italic in the database, which means it does not exist itself and can not be found in a firestore query.
How do i prevent this?
答案1
得分: 2
The easiest way is to materialize these non-existing docs (shown in italic) by creating them with a dummy field. Something along the following lines:
const parentPathRef = doc(db, "schools/" + userInfoStore.userInfo?.schoolID + '/courses/' + currentCourse);
const childPathRef = doc(db, "schools/" + userInfoStore.userInfo?.schoolID + '/courses/' + currentCourse + '/students/' + val[columnNames.value.UID]);
const data = {
vorname: val[columnNames.value.Vorname],
nachname: val[columnNames.value.Nachname],
klasse: val[columnNames.value.Klasse],
uid: val[columnNames.value.UID]
}
batch.set(parentPathRef, { foo: 'bar' });
batch.set(childPathRef, data);
英文:
> This works, however it leaves the collection with the name of
> "currentcourse" in italic in the database, which means it does not
> exist itself and can not be found in firestore queue [I guess you mean "query" here].
>
> How do i prevent this?
The easiest way is to materialize these non-existing docs (shown in italic) by creating them with a dummy field. Something along the following lines:
const parentPathRef = doc(db, "schools/" + userInfoStore.userInfo?.schoolID + '/courses/' + currentCourse);
const childPathRef = doc(db, "schools/" + userInfoStore.userInfo?.schoolID + '/courses/' + currentCourse + '/students/' + val[columnNames.value.UID]);
const data = {
vorname: val[columnNames.value.Vorname],
nachname: val[columnNames.value.Nachname],
klasse: val[columnNames.value.Klasse],
uid: val[columnNames.value.UID]
}
batch.set(parentPathRef, {foo; 'bar'});
batch.set(childPathRef, data);
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论