Firebase Firestore - 或查询

时间:2017-10-13 09:27:19

标签: android google-cloud-firestore

如何通过一个字段的多个值获取数据?例如,我有包含帖子的数据库,我想查询blogId为1或2的所有帖子,按时间戳排序。

collection("posts").whereEqualTo("blogId", "1")
.whereEqualTo("blogId", 2).orderBy("timestamp", Query.Direction.DESCENDING).limit(50)

上面的代码不起作用:(

如何实现这一目标? 问候:)

9 个答案:

答案 0 :(得分:3)

我无法找到任何有关OR条件的OR的能力的文档。但您可以在blogId上重写您的要求,如下所示:

WHERE blogId > 0 AND blogId < 3

试试这段代码:

collection("posts")
.where("blogId", ">", "0")
.where("blogId", "<", "3")
.orderBy("timestamp", Query.Direction.DESCENDING)
.limit(50)

答案 1 :(得分:2)

您可以组合Observable并返回为一个

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

答案 2 :(得分:2)

Firebase监听了我们的请求,其中包括来自IN的{​​{1}}查询。这是一种7 Nov, 2019查询,您最多可以使用OR个过滤器。

对于android:

10 OR

Firebase documentation

答案 3 :(得分:1)

Firebase Firestore中不接受

OR运算符。 通常使用firebase语法,您可以调用两个集合:

const res1 = async collection("posts", ref => ref.where('blogId', '==', 1).get();
const res2 = async collection("posts", ref => ref.where('blogId', '==', 2).get();

,您可以合并结果,然后再投放到视图中。

但是在这种情况下,如果您具有blogId,则可以使用以下语法: collection("posts").orderBy('blogId').startAt(1).endAt(2);

e.d

答案 4 :(得分:1)

Firestore now supports "IN" queries为此。

查询如下:

database.collection("collectionName").where("fieldName", "in", ["fieldValue1", "fieldValue2"]);

最多可以有10个值(fieldValueX)来检查其中的“ IN”。


所需的代码OP如下:

database.collection("posts").where("blogId", "in", ["1", "2"]); 

答案 5 :(得分:1)

您可以使用De Morgaan's法则将AND查询重写为OR查询。

答案 6 :(得分:1)

对于Android,我正在使用像这样的OR查询。

List<String> values = new ArrayList<>();
    values.add("Value 1");
    values.add("Value 2");

,然后使用.whereIn查询。

db.collection("collectionName")
            .whereIn("fieldName", values)   // where values is the list we created
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {

                    if (task.isSuccessful()) {

                      // Do your stuff

                    }

                }
            });

答案 7 :(得分:0)

试试这个

collection("posts").start("blogId", "1")
.end("blogId", 2).orderBy("timestamp", Query.Direction.DESCENDING).limit(50)

答案 8 :(得分:0)

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