如何获取 Firestore 中 ID 列表的数据?
How to get data for a list of ids in Firestore?
我在 Firebase Firestore 数据库中有以下 多对多 关系:
老师(合集)
学生(合集)
一个老师可以有很多学生。
一个学生可以有多个老师。
在我的数据库中,Teacher(集合)有一个 属性 studentIDs: [1,2,3 ... 100]
此时我多次使用Array'in'从指定Teacher获取所有学生数据:
const studentIDs = [1,2,3..10];
const students = await userRef.where(firebase.firestore.FieldPath.documentId(), 'in', studentIDs).get();
....
问题是 'in' 限制为最多 10 个项目,所以如果老师有 100 个学生,我需要做 10 个请求。
你是怎么解决这个问题的?在 Firestore 中获取大量文档 ID 数据的最佳方法是什么? [1、2、3、4、5 ... 1000]
没有 out-of-the-box 适合您的情况的解决方案。您必须一个接一个地获取每个学生文档。由于您并行执行所有这些提取,因此应按如下方式使用 Promise.all()
:
const teacherDocRef = db.collection('teachers').doc('teacher1');
const teacherDoc = await teacherDocRef.get();
const studentIDs = teacherDoc.data().studentIDs;
const promises = [];
studentIDs.forEach(studentID => promises.push(db.collection('students').doc(studentID).get()));
const studentDocs = await Promise.all(promises); // Array of Document Snapshots
话虽如此,在 NoSQL 数据建模中复制数据以提高查询效率是很常见的。
如果,例如,当你找老师时,你只需要学生姓名列表(没有每个学生文档中存在的所有数据,例如没有学生的地址,课程列表等。 .) 您可以在教师文档中复制学生姓名。这是一个经典的方法。
缺点是您需要使保存数据的不同文档保持同步(在我们的例子中是学生文档和教师文档)。为此,您可以使用 batched writes (from the frontend) or Cloud Functions(从后端)。
我在 Firebase Firestore 数据库中有以下 多对多 关系:
老师(合集)
学生(合集)
一个老师可以有很多学生。
一个学生可以有多个老师。
在我的数据库中,Teacher(集合)有一个 属性 studentIDs: [1,2,3 ... 100]
此时我多次使用Array'in'从指定Teacher获取所有学生数据:
const studentIDs = [1,2,3..10];
const students = await userRef.where(firebase.firestore.FieldPath.documentId(), 'in', studentIDs).get();
....
问题是 'in' 限制为最多 10 个项目,所以如果老师有 100 个学生,我需要做 10 个请求。
你是怎么解决这个问题的?在 Firestore 中获取大量文档 ID 数据的最佳方法是什么? [1、2、3、4、5 ... 1000]
没有 out-of-the-box 适合您的情况的解决方案。您必须一个接一个地获取每个学生文档。由于您并行执行所有这些提取,因此应按如下方式使用 Promise.all()
:
const teacherDocRef = db.collection('teachers').doc('teacher1');
const teacherDoc = await teacherDocRef.get();
const studentIDs = teacherDoc.data().studentIDs;
const promises = [];
studentIDs.forEach(studentID => promises.push(db.collection('students').doc(studentID).get()));
const studentDocs = await Promise.all(promises); // Array of Document Snapshots
话虽如此,在 NoSQL 数据建模中复制数据以提高查询效率是很常见的。
如果,例如,当你找老师时,你只需要学生姓名列表(没有每个学生文档中存在的所有数据,例如没有学生的地址,课程列表等。 .) 您可以在教师文档中复制学生姓名。这是一个经典的方法。
缺点是您需要使保存数据的不同文档保持同步(在我们的例子中是学生文档和教师文档)。为此,您可以使用 batched writes (from the frontend) or Cloud Functions(从后端)。