РЕДАКТИРОВАТЬ Таким образом, после рассмотрения этой проблемы с разработчиком Firebase это работает по проекту, и нет никакого реального способа добиться этого.Официальный ответ от firestore dev:
По общему признанию, некоторые виды запросов являются трудными, если не осуществимыми, при работе с NoSQL-проектом Firestore.Если отсутствие таких возможностей считается преградой для вашего варианта использования, то, скорее всего, 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},
]
И если я выполняю тот же запрос с последним удаленным заказом, я на самом деле получаю точно такие же результаты:
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 ине с библиотекой, которую я использую response-native-firebase.Используемый мной Firebase Firestore SDK включен 5.0.4
. Я полагаю,
EDIT Вот как я на самом деле использую код в своем реактивном проекте:
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 выводит действительный querysnapshot, и поле _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"
}
}
}
(плохая печать из-за копирования)