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);

издание