3 回答
TA贡献1765条经验 获得超5个赞
在您的不等式过滤器属性之后添加一个虚拟订单,并更改您的查询优先级以满足您的需求。
我在 javascript 上遇到了同样的问题,但我相信它也是一个 java 解决方案。
完整解决方案:
当我运行查询时:
module.exports.getLastGroupChat = async function (groupId) {
let colRef = db.collection('messages')
colRef = colRef.where('groupId', '==', groupId)
colRef = colRef.where('userId', '!=', '')
colRef = colRef.orderBy('timestamp', 'desc').limit(1)
const doc = await colRef.get()
return doc
}
并收到:
不等式过滤器属性和第一排序顺序必须相同:userId和timestamp
为了解决这个问题,首先,我必须在我的不等式过滤器之后添加一个具有相同不等式属性的排序顺序。
此外,我必须更改查询优先级以实现不等式属性的虚拟排序顺序。
注意:您可以where -> order -> where -> order在同一个查询上运行!
module.exports.getLastGroupChat = async function (groupId) {
let colRef = db.collection('messages')
colRef = colRef.where('userId', '!=', '')
colRef = colRef.orderBy('userId', 'desc')
colRef = colRef.where('groupId', '==', groupId)
colRef = colRef.orderBy('timestamp', 'desc').limit(1)
const doc = await colRef.get()
return doc
}
该查询在我的本地调试 Firestore 上运行良好。将您的更改推送到您的 firebase 云函数并触发您的函数。查看您的函数日志,您可能会收到索引错误。
查询需要索引。你可以在这里创建它:https ://console.firebase.google.com/v1/r/project ..。
确保您进入链接并建立索引。大约需要五到十分钟才能生效。然后再次运行你的功能,一切都应该很好。
玩得开心!:)
TA贡献1829条经验 获得超4个赞
自从提出这个问题以来,也许firebase已经改变了一些事情。
答案是您可以对不同的字段进行过滤和排序。
您可以链接 orderby 和过滤器,但是,如果您先过滤,则必须先按该过滤器排序,然后才能按任何其他字段排序。例如
citiesRef.where('population', '>', 2500000).orderBy('population').orderBy('country');
在他们的文档中。 https://firebase.google.com/docs/firestore/query-data/order-limit-data#order_and_limit_data
However, if you have a filter with a range comparison (<, <=, >, >=), your first ordering must be on the same field, see the list of orderBy() limitations below.
你可以链接不同字段的 orderBys,我只是在我的一个查询中做到了。(第一次运行可能会报错,要求创建索引,甚至还有创建索引的链接)
await db.collection('daily_equipments').where('date', '<', tomorrow._d).where('date', '>=', date).orderBy('date').orderBy('order','asc').get();
添加回答
举报