在我用Ionic和Firestore制作的web应用程序中,我想选择5个随机项目来出售--这些项目是集合collectA中的文档。为了做到这一点,我已经看到firebase不允许以随机的方式获取文档,但是在本文Firestore: How to get random documents in a collection中给出了一个可能的解决方案。但我想要5个随机项目,然后另有5个尚未被拿走,以此类推。当所有的物品都被拿走了,你就重新开始。考虑一个新的collectB集合,在其中插入随机获取的5个项并从collectA集合中删除它们,会是一个好的解决方案吗?那就把所有的东西都拿走了。当collectA变为空且所有项都在collectB中时,执行相同的过程,但从collectB到collectA。我认为不利之处仅在于核销成本的增加(每100,000美元0.02美元)。写入并不是因为当我接受这5个随机项时,我仍然需要修改这些文档的一些字段。我不希望查询速度减慢,也不希望成本增加很多。
发布于 2021-11-30 07:18:06
如果应用程序中的所有用户都需要5个新的随机项,那么不要在Firestore中执行该操作,而是在实时数据库中这样做,选择这样的随机项要便宜得多。在同一个项目中,两个数据库都很好地协同工作。话虽如此,你可以有这样的结构:
Firebase-root
|
--- products
| |
| --- $productId: true
| |
| --- $productId: true
|
--- consumedProducts
|
--- $productId: true
|
--- $productId: true这个问题有两种解决办法。每次从"products“节点获得5个新的随机ID时,还将它们添加到"consumedProducts”节点。要避免再次选择相同的if,请始终检查"consumedProducts“节点中是否还存在新的if。过了一段时间,当"consumedProducts“将包含与"products”节点相同的ID时,您可以简单地删除它并重新开始。第二个解决方案可能是将这5个元素添加到"consumedProducts“中,然后将它们从"products”节点中删除。当"products“节点保持空时,对"consumedProducts”执行相同的操作。
现在,根据您的应用程序的逻辑,您应该决定哪个更好地使用,但请记住,始终保持同步,在实时数据库中使用Firestore的实际产品和相应的ID。例如,如果在Firestore中添加了一个新产品,则在Realtime节点中添加相应的ID。当您从Firestore中删除一个产品时,也会发生这种情况。
https://stackoverflow.com/questions/70159836
复制相似问题