Я работаю над реализацией, в которой мне нужно эффективно прослушать следующий псевдопросмотр:
SELECT * FROM 'trips' WHERE 'travelers' IS ONE OF [ x,y,z ]
Поскольку firebase не допускает запросов OR, мое текущее решение - создать все возможныеПерестановки поездок x путешественников и прослушивания всех их.
// Returns an array of {}
const permutations = ( locs, uids ) => {
let perms = locs.map( location => {
return uids.map( uid => ( { location: location, uid: uid } ) )
} )
return [].concat( ...perms )
}
// Trip destinations
let destinations = [ 'Amsterdam', 'Berlin' ]
// UIDs of travelers (in reality unique hashes)
let uids = [ 'John', 'Mary' ]
// Listeners
return Promise.all( permutations( locations, friends ).map( ( { location, uid } ) => {
this.db.collection( 'trips' )
.where( 'destination', '==', location )
.where( 'traveler.uid', '==', uid )
.onSnapshot( snapshot => {
Promise.resolve( snapshot.docs )
// Filter out empties
.then( docs => docs.map( doc => doc.exists ? doc : false ) )
.then( docs => docs.filter( doc => doc != false ) )
// Grab data from docs
.then( docs => docs.map( doc => ( { ...doc.data(), id: doc.id } ) ) )
// Call a callback (used int he bigger scheme of a redux listener)
.then( callback )
} )
} ) )
} )
В настоящее время это приводит к нескольким слушателям, но если массивы назначения / uids становятся большими, это может привести к МАССИВНОМУ количеству слушателей.
Я мог бы также запустить ручной триггер поиска, но мне нравится работать с обновлениями в реальном времени.
Имеет ли потенциально прослушивание bazillion слушателей проблему в firebase?Либо для производительности или стоимости?