在我的Firestore数据库中,我在集合中有一些文档如下所示:
{
name: "Item 1",
count: 2,
timestamp: January 29, 2018 at 3:43:12 PM UTC-8
}
我正在尝试查询此集合,以便文档按count
按降序排序,并且timestamp
的日期等于今天的日期。
使用Moment.js,这是我到目前为止的查询:
const startOfToday = moment().startOf('day').toDate();
const endOfToday = moment().endOf('day').toDate();
const query = db.collection('items')
.orderBy('timestamp', 'desc')
.orderBy('count', 'desc')
.where('timestamp', '>=', startOfToday)
.where('timestamp', '<=', endOfToday);
此查询确实会将今天的记录作为timestamp
的日期获取,但它似乎首先按timestamp
排序,如果两个具有相同的timestamp
然后,它将按count
排序。
显而易见的解决方案是切换orderBy
函数的顺序,以便按count
然后timestamp
排序,但当我尝试执行此操作时,Firestore会抛出以下错误:< / p>
FirebaseError:查询无效。您在字段'timestamp'上有一个不等式(&lt;,&lt; =,&gt;或&gt; =)的过滤器,因此您还必须使用'timestamp'作为第一个Query.orderBy(),但是您的第一个Query.orderBy()代替字段'count'。
如果有人有任何想法,我会非常感激。
答案 0 :(得分:1)
正如评论中所述,Cloud Firestore不支持在范围过滤器和/或order by子句中使用多个字段。
鉴于您的查询的性质,将其更改为相等过滤器(今天的日期)和order by子句(count)相对简单。您需要存储一个单独的字段,我们称之为date
,只包含日期(例如2018/01/30
),而不是时间。然后,您可以查询:
const query = db.collection('items')
.orderBy('count', 'desc')
.where('date', '==', today);