问题描述
我正在使用Firebase和Firestore,并且有一个名为singers
的旧集合,其中包含具有某些构造的文档,例如
name: string
genre: string,...
现在,我需要从前端的集合中订购这些文档,并且需要按照从最早到最新的顺序进行操作,但是如果没有createdAt
之类的字段,我将无法执行,因为firestore并不提供有关文档创建时间的任何信息。
我做什么
首先在注册时添加了字段createdAt
,现在新创建的歌手具有字段createdAt
,但旧歌手则没有。所以我想按顺序订购它:
- 所有歌手(无字段
createdAt
或其他任意字段的歌手) - 字段为
createdAt
的歌手从最早的到最新的
示例数据
const singers = [
{
name: 'Phil',genre: 'Pop',...
},{
name: 'Bom',genre: 'Rock',{
name: 'Tom',genre: 'Hiphop',createdAt: 190000000,{
name: 'John',createdAt: 195000000,]
const sortedSingers = orderBy(
singers,// collection with all singers from firestore
[singer => (singer.createdAt?? singer.name)],['desc'],);
它以错误的顺序呈现:
- 汤姆
- 约翰
- Bom
- 菲尔
我想这样订购:
- Bom / Phil
- Bom / Phil
- 汤姆
- 约翰
如何使orderBy
的无序字段的文档排在列表的开头?
解决方法
我做了这样的事情:
const singerCreatedAt: any = singers.map((singer: Singer) =>
singer.createdAt
? { ...singer,createdAt: singer.createdAt?.toDate() }
: { ...singer,createdAt: new Date(190000000000) },);
const sortedSingers = orderBy(singerCreatedAt,['createdAt','asc']);