Google cloud firestore 在异步文档创建时创建有序索引

Google cloud firestore 在异步文档创建时创建有序索引,google-cloud-firestore,google-cloud-functions,Google Cloud Firestore,Google Cloud Functions,我正在客户端上构建一个具有高级延迟加载功能的评论系统,如下所示: comment 1 | [load more] | comment 7 | comment 8 | [load more] | comment 10 为此,我需要根据创建时间对我的注释文档进行编号(以了解两个注释之间是否有更多注释要加载) 问题是,由于云函数是异步的,所以我并没有真正的方法根据创建时间为传入文档编制索引 例如,一个文档在几毫秒后创建,另一个文档可能会更早地触发云函数,从而导致索引中出现错误 我现在能想

我正在客户端上构建一个具有高级延迟加载功能的评论系统,如下所示:

comment 1
 |
[load more]
 | 
comment 7
 |
comment 8
 |
[load more]
 |
comment 10
为此,我需要根据创建时间对我的
注释
文档进行编号(以了解两个注释之间是否有更多注释要加载)

问题是,由于云函数是异步的,所以我并没有真正的方法根据创建时间为传入文档编制索引

例如,一个文档在几毫秒后创建,另一个文档可能会更早地触发云函数,从而导致索引中出现错误

我现在能想到的唯一解决方案是,对于每个传入的
注释
,运行一个查询,查询集合中时间戳低于此值的
注释
,并将其用作索引。但就成本/性能而言,这显然是不可行的


你将如何处理这个问题?:)

将注释的创建时间戳分配给函数本身,而不是客户端。然后,您仍然可以获得基于时间的排序,而不必要求客户端立即同步文档写入。

多亏了Doug的建议,在云函数中分配时间戳之前,将问题向后转并分配索引,以确保索引顺序,我想出了以下代码:


const{post_id,text}=数据;
返回db.runTransaction(异步事务=>{
const postDocRef=db.collection('posts').doc(post_id);
const postComDocRef=postDocRef.collection('comments').doc();
const postDoc=wait transaction.get(postDocRef);
如果(!postDoc.存在)
抛出新函数。https.HttpsError(
“未找到”,
`找不到Post${Post_id}`
);
试一试{
const comments\u count=postDoc.data()!.comments\u count;
事务。更新(postDocRef{
评论数量:评论数量+1
});
事务。创建(postComDocRef{
作者:context.auth!.uid,
文本,
索引:评论数,
创建位置:admin.firestore.Timestamp.now()
});
}捕获(e){
抛出新函数.https.HttpsError('internal','Transaction failed.`);
}
});

它使用一个事务获取当前已发表评论计数的原子值,然后在分配相应的时间戳之前将该值用作评论索引

谢谢!我用你的建议加了一个答案,希望你能给我一些建议:)我不想在这里用索引。云函数可能会无序运行,所以我只接受按时间戳排序。@DougStevenson这里需要显式索引,以便在客户端上进行延迟加载。我需要知道在一条评论和另一条评论之间是否有更多的评论要加载。我可以通过比较两条注释的索引来做到这一点。FireStore有一个分页API,这使得这些索引基本上是不必要的。@DougStevenson即使使用光标,我仍然需要知道该范围内是否有一些数据需要查询。我可以在该范围内进行查询并计算结果,但这有点违背了这里的延迟加载方法。我想我不理解加载任意范围的索引注释的要求,但如果这对您有效,请使用它运行。