Firestore 查询 orderBy 不起作用?
Posted
技术标签:
【中文标题】Firestore 查询 orderBy 不起作用?【英文标题】:Firestore query orderBy not working? 【发布时间】:2018-12-28 06:31:00 【问题描述】:对时间戳类型字段进行 Firestore 查询的 FutureBuilder 返回快照中没有数据。但是,没有 orderBy 的相同查询可以正常工作。 我错过了什么?感谢您的帮助。
// Working code
future: Firestore.instance.collection('messages').where('toid',isEqualTo: _emailID).getDocuments(),
builder: (context, snapshot) ...
// Not Working - returns to if(!snapshot.hasData)
future: Firestore.instance.collection('messages').where('toid',isEqualTo: _emailID).orderBy('_timeStampUTC', descending: true).getDocuments(),
builder: (context, snapshot) ...
【问题讨论】:
你能分享一些代码来获得解决方案吗? 【参考方案1】:我认为您在这里缺少'
'_timeStampUTC
,所以应该是:
orderBy('_timeStampUTC', descending: true)
编辑:
此外,您需要确保为toid
和其他_timeStampUTC
创建索引,这是在您尝试按不在您查询位置的属性进行排序时完成的。
【讨论】:
很抱歉。那是我凭记忆打字的错字。我已经纠正了这个问题。谢谢。 嗯好的,那么,您是否尝试为_timeStampUTC
创建an index?
刚刚尝试了 '_timeStampUTC' 字段上的索引 - 没有运气。谢谢。
抱歉,我对 Dart 不太擅长,我正在查看 their docs,一切看起来都正确...我看你不是 the only one with this problem,但他们解决它的方式是通过创建索引
我再次尝试您的想法。经过一番挖掘,我发现您必须将索引放在 where 字段和 orderBy 字段【参考方案2】:
对_timeStampUTC
使用@ServerTimestamp
注释并尝试通过查询来订购
为了让 Firestore 自动生成 Timestamp 值,当我们 上传数据到数据库,一定要使用注解 @ServerTimestamp 并将值设置为 null。
【讨论】:
【参考方案3】:是的,它只是缺少一个索引。如果您使用的是 firestore.indexes.json 然后添加:
"collectionId": "messages",
"fields": [
"fieldPath": "toid", "mode": "ASCENDING" ,
"fieldPath": "_timeStampUTC", "mode": "DESCENDING"
]
【讨论】:
【参考方案4】:写下你的查询:-
Firestore.instance.collection('messages').where('toid',isEqualTo: _emailID).orderBy('_timeStampUTC', descending: true).getDocuments()
在此之后,将在您的日志中生成一个链接。它会像这样https://console.firebase.google.com/v1/r/project...........。 在创建索引后,点击该链接为您的查询创建索引重新加载您的应用程序,现在您将能够获取所有集合。 :)
【讨论】:
【参考方案5】:对于那些仍然面临问题并且不知道如何添加索引的人
点击 Firebase 控制台中的添加索引: Cloud Firestore indexes
部分:
您需要添加集合 id、字段和查询范围并创建索引。建立索引需要一些时间。
在字段上添加索引后,您将在下方显示启用状态
【讨论】:
以上是关于Firestore 查询 orderBy 不起作用?的主要内容,如果未能解决你的问题,请参考以下文章
LINQ 查询添加 orderby 使 Skip 和 Take 不起作用 Linqpad
我可以使用 where equals 子句和 orderby 查询 Cloud Firestore 集合吗?