按数字字段排序,其中时间戳位于Cloud Firestore中的给定日期?

时间:2018-01-29 11:48:14

标签: javascript google-cloud-firestore

在我的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'。

如果有人有任何想法,我会非常感激。

1 个答案:

答案 0 :(得分:1)

正如评论中所述,Cloud Firestore不支持在范围过滤器和/或order by子句中使用多个字段。

鉴于您的查询的性质,将其更改为相等过滤器(今天的日期)和order by子句(count)相对简单。您需要存储一个单独的字段,我们称之为date,只包含日期(例如2018/01/30),而不是时间。然后,您可以查询:

const query = db.collection('items')
                .orderBy('count', 'desc')
                .where('date', '==', today);