Wil*_*iam 7 arrays firebase flutter google-cloud-firestore
我正在使用 flutter 和 firebase 作为我的后端制作一个移动应用程序。
我有一组存储用户信息的用户文档。其中一个字段是一个引用数组(另一个集合中的引用文档),我想在像批处理这样的操作中使用它,然后允许读取所有文档。
我知道批处理只允许写入数据库,我的第二个选项是事务,它需要在我试图避免的读取后写入。
有没有一种方法可以在一次操作中读取多个文档而不必使用事务?
Firestore 不提供正式的批量读取 API。正如 Frank 在他的评论中提到的,有一种方法可以使用IN它们的 ID 从单个集合中获取多个文档。但是,所有文档都必须在同一个集合中,并且每个查询不能超过 10 个文档。您也可以单独为每个文档使用 get() ,因为IN查询有限制,并且不能保证执行速度比单个文档快。两种解决方案都不能保证“一致”,因此在任何给定时刻,获取的任何一个文档都可能比其他文档“更新鲜”。
如果您知道需要获取的文档 ID 和文档的集合路径,则始终可以使用Firebase Admin SDK中公开的getAll()方法(至少对于 Node.js 环境)。
然后,例如,您可以编写一个HTTPS 可调用函数,该函数将接受绝对文档路径列表并使用该getAll()方法对它们执行“批量获取”操作。
例如
// Import firebase functionality
const functions = require('firebase-functions');
const admin = require('firebase-admin');
// Configure firebase app
admin.initializeApp(functions.config().firebase);
// HTTPS callable function
exports.getDocs = functions.https.onCall((data, context) => {
    const docPathList = data.list; // e.g. ["users/Jkd94kdmdks", "users/8nkdjsld", etc...]
    const firestore = admin.firestore();
    var docList = [];
    for (var i = 0; i <= docPathList.length - 1; i++) {
        const docPath = docPathList[i];
        const doc = firestore.doc(docPath);
        docList.push(doc);
    }
    // Get all
    return firestore.getAll(...docList)
        .then(results => {
            return { data : results.map(doc => doc.data()) };
        })
        .catch(err => {
            return { error : err };
        })
});
不确定使用 可以获取的文档数量的限制(如果有)是多少getAll(),但我确实知道我的应用程序能够使用此方法成功地每次调用获取至少 50 个文档。
| 归档时间: | 
 | 
| 查看次数: | 4405 次 | 
| 最近记录: |