Google cloud firestore Firestore组集合查询,仅返回每个子集合中的最后一个文档

Google cloud firestore Firestore组集合查询,仅返回每个子集合中的最后一个文档,google-cloud-firestore,Google Cloud Firestore,我正在Flatter中构建一个1-1聊天系统,它将每对聊天记录的聊天数据存储在firestore子集合中。我想能够显示一个列表,用户可以看到他的聊天伙伴和他们的最新消息(一个LaWhatsApp)。我想我可以做一些类似的事情: Firestore.instance.collectionGroup('Chats')。其中('idFrom',isEqualTo:uid) .限额(1) .orderBy(“时间戳”,降序:true) .snapshots()单次查询无法完成您要执行的操作。集合组查询

我正在Flatter中构建一个1-1聊天系统,它将每对聊天记录的聊天数据存储在firestore子集合中。我想能够显示一个列表,用户可以看到他的聊天伙伴和他们的最新消息(一个LaWhatsApp)。我想我可以做一些类似的事情:

Firestore.instance.collectionGroup('Chats')。其中('idFrom',isEqualTo:uid)
.限额(1)
.orderBy(“时间戳”,降序:true)

.snapshots()
单次查询无法完成您要执行的操作。集合组查询考虑所有同名集合中的所有文档。它不能对每个不同的子集合进行特殊考虑


您必须单独查询每个子集合,或者在不同的子集合中复制最新的消息,该子集合仅包含该消息。

我认为您必须取消firebase查询的限制。这太糟糕了。我要告别firestore,回到好的ole SQL Server,因为我仍然需要遇到SQL Server(或任何RDBMS)无法处理的数据查询需求。NoSQL类型数据库中的数据结构与SQL非常不同。数据复制和非规范化是非常常见的技术,它们可以帮助您的系统在无需维护的情况下进行大规模扩展,而SQL数据库则无法做到这一点。基本上,您必须选择是要解决扩展SQL带来的问题,还是要解决构造NoSQL数据的问题。但是,如果您不需要太大的扩展,SQL可能更适合您。无论如何,我想出了以下解决方案:为每个新消息“latest”添加一个标志:true,这样我就可以在查询中包含这个标志。必须批量添加新消息:首先更新给定聊天对的所有groupcollections,并将latest设置为false,然后使用latest=true创建。你认为这样做行得通吗?如果集合中同时添加了许多内容,可能会破坏对方对
最新
标志的更改,那么这样做就行不通了。您将无法执行安全标识最新消息、更新和添加新消息的原子更新(事务)。不,根本不使用标志。我最初的建议是将最新消息复制到另一个集合中的文档中。可以随主集合中每个新消息的添加进行原子更新。