Firebase Firestore - запрос OR
Как получить данные по нескольким значениям одного поля? Например, у меня есть база данных с сообщениями, и я хочу запросить для всех сообщений, где blogId - 1 или 2, сортировка по метке времени.
collection("posts").whereEqualTo("blogId", "1")
.whereEqualTo("blogId", 2).orderBy("timestamp", Query.Direction.DESCENDING).limit(50)
Код выше не работает: (
Как достичь этого?
С уважением:)
Ответы
Ответ 1
Я не мог найти документацию о способности OR вместе, когда условия. Но вы можете перефразировать свое требование на blogId
следующим образом:
WHERE blogId > 0 AND blogId < 3
Попробуйте этот код:
collection("posts")
.where("blogId", ">", "0")
.where("blogId", "<", "3")
.orderBy("timestamp", Query.Direction.DESCENDING)
.limit(50)
Ответ 2
Вы можете объединить Observables и вернуться как один
orQuery(){
const $one = this.afs.collection("posts", ref => ref.where("blogId","==","1")).valueChanges();
const $two = this.afs.collection("posts", ref => ref.where("blogId","==","2")).valueChanges();
return combineLatest($one,$two).pipe(
map(([one, two]) => [...one, ...two])
)
}
getOr(){
this.orQuery().subscribe(data => console.log(data))
}
Ответ 3
Попробуйте это
collection("posts").start("blogId", "1")
.end("blogId", 2).orderBy("timestamp", Query.Direction.DESCENDING).limit(50)
Ответ 4
У Firestore нет запросов OR
. Они могут сделать это, выполнив два запроса и объединяя их.
Вы могли бы, например:
const search = ( key, value ) => collection( 'users' ).where( key, '==', value ).get().then( doc => doc.data() )
Promise.all( [ search( 'name', 'John' ), search( 'name', 'Johnny' ) ] )
.then( ( [ one, two ] ) => one.concat( two ) )
.then( allResults => dothings() )
Ответ 5
OR
оператор не принимается в пожарном депо. Обычно используя синтаксис firebase вы можете вызывать две коллекции:
const res1 = async collection("posts", ref => ref.where('blogId', '==', 1).get();
const res2 = async collection("posts", ref => ref.where('blogId', '==', 2).get();
и вы можете объединить результаты перед подачей в представление.
Но в этом случае, когда у вас есть blogIds, вы можете использовать этот синтаксис: collection("posts").orderBy('blogId').startAt(1).endAt(2);
издание