【发布时间】:2021-11-02 15:18:17
【问题描述】:
假设有大量这样的文档集合:
{
createdAt: 1630789008561, // timestamp
count: 5
},
{
createdAt: 1630788666511, // timestamp
count: 50
},
...
我想查询在某个时间戳之后创建的计数最多的 50 个文档。
一个简单的解决方案是查询此特定时间戳之后的所有文档,然后自行排序。但是我不能,因为我的数据库太大了。
我的第一次查询尝试是:
db.collection("docs")
.where("createdAt", ">", timestamp)
.orderBy("count", "desc")
.limit(50)
.get();
此查询在 Firestore 中不起作用并抛出:
错误:3 INVALID_ARGUMENT:不等式过滤器属性和第一排序顺序必须相同:createdAt 和 count`
然后我尝试了:
db.collection("docs")
.where("createdAt", ">", timestamp)
.orderBy("createdAt", "desc")
.orderBy("count", "desc")
.limit(50)
.get()
这个查询对我不起作用,因为它的作用是在时间戳之后获取 50 个文档,然后按计数对它们进行排序,以防它们具有相同的时间戳,这不是我想要的。
修改为什么这个查询不起作用:
如果我有 150 个文档:
- 在第 1 天创建了 50 个,计数为 1
- 在第 2 天创建了 50 个,计数为 2
- 在第 3 天创建了 50 个,计数为 1
如果我使用时间戳为 0 的查询,我将返回上次创建的 50 个文档(因为我使用的是 .orderBy("createdAt", "desc")),这些文档的计数为 1,显然不是计数最高的文档。
如果你改用asc,你会得到第一个文档,但仍然不是最高计数。
我想要一个查询,如果时间戳为 0,它将给我 50 个文档,计数为 2。
我怎样才能实现我想要的?
编辑我当前使用的解决方案(我想更改):
由于我的时间范围是一天,所以我在每个文档中添加一个day 字段,如下所示:
{
day: '2021-09-06',
createdAt: 1630789008561, // timestamp
count: 5
},
{
day: '2021-09-05',
createdAt: 1630788666511, // timestamp
count: 50
},
...
然后我可以像这样进行相等性检查:
db
.collection("docs")
.where("day", "==", '2021-09-05')
.orderBy("count", "desc")
.limit(50)
.get();
这可行,但这不是很好,因为每次我的时间范围发生变化时,我都需要更新我的数据库架构并使用新字段更新每个文档。
【问题讨论】:
标签: javascript firebase google-cloud-platform google-cloud-firestore