编辑 因此,在与Firebase开发人员一起审查了此问题之后,这是设计使然,并且没有实现此目的的实际方法。 firestore开发人员的官方回应:
诚然,某些类型的查询比较困难,如果不可行, 在使用Firestore的NoSQL设计时。如果缺乏这样 功能被认为是您的用例的交易突破点,然后 Firestore可能不是您合适的数据库解决方案。
如果您渴望实现类似的目标,那么此解决方案可能会为您工作:https://firebase.google.com/docs/firestore/solutions/arrays#solution_a_map_of_values。
如果不总是有AWS
================================================ ==========================
我注意到第二个orderBy
查询选项对返回的数据没有任何作用。
考虑以下查询:
firebase.firestore()
.collection('posts')
.orderBy('date', 'desc')
.where('date', '>', new Date(1529802276644))
.orderBy('rating', 'desc')
.limit(size)
此查询打算按posts
字段对date
进行排序,然后过滤最后两天,然后按rating
对其进行排序。
此查询当前在两天内返回3条帖子,但是未按评分排序。我收到的结果是:
[
{date: 3 hours ago, rating: 1},
{date: 5 hours ago, rating: -1},
{date: 9 hours ago, rating: 0},
]
如果我在删除了最后一个orderB的情况下进行了相同的查询,我实际上会得到完全相同的结果:
firebase.firestore()
.collection('posts')
.orderBy('date', 'desc')
.where('date', '>', new Date(1529802276644))
.limit(size)
产生:
[
{date: 3 hours ago, rating: 1},
{date: 5 hours ago, rating: -1},
{date: 9 hours ago, rating: 0},
]
我目前已启用帖子索引。我相当确定索引是正确的,因为在此之前我之前遇到过有关丢失索引的错误,然后使用此索引对其进行了修复:
posts | date DESC rating DESC | enabled
我很确定问题出在firebase上,而不是我在使用react-native-firebase的库上。我使用的Firebase Firestore SDK在5.0.4
上,我相信
编辑 这是我实际在我的react-native项目中使用代码的方式:
const episodeRef = firebase.firestore().collection('posts');
const baseRequest = episodeRef.orderBy('date', 'desc').where('date', '>', new Date(1529802276644)).orderBy('rating', 'desc').limit(25)
const documentSnapshots = await baseRequest.get()
console.log('documentSnapshots', documentSnapshots);
console.log打印出有效的查询快照,并且_query字段大致如下:
_fieldFilters:{
fieldPath:{
string:"date",
type:"string"
},
operator:"GREATER_THAN",
value:{
type:"date",
value:1529802276644
},
}
_fieldOrders:{
0:{
direction:"DESCENDING",
fieldPath: {
string:"date",
type:"string"
},
}
1:{
direction:"DESCENDING"
fieldPath:{
string:"rating",
type:"string"
}
}
}
(由于复印导致打印质量差)
答案 0 :(得分:0)
我不确定这是原因,但是在Firebase Realtime数据库中,这是一个常见错误,因此在这里也值得短谈。
将QuerySnapshot
documentSnapshots
转换为字符串时,它将丢失有关数据顺序的任何信息。
相反,用QuerySnapshot.forEach()
遍历结果,以确保维持以下顺序请求数据:
const documentSnapshots = await baseRequest.get()
documentSnapshots.forEach(document => {
console.log('document', document);
});
如果可行,这可能也可行:
const documentSnapshots = await baseRequest.get()
console.log('document', documentSnapshots.docs());