This question already has answers here:
Query based on multiple where clauses in Firebase
                                
                                    (4个答案)
                                
                        
                                4年前关闭。
            
                    
我有这种用例,我必须根据用户以对象形式发出的参数进行查询。用户可以发出多个参数进行查询。它类似于SQL中的“ SELECT * FROM users WHERE FIRST_NAME ='something'AND LAST_NAME ='something'”。

一个示例对象可以是:

var object= {
    email: "some...@google.com",
    location: "San Jose, CA"
};


我在某些端点的Firebase数据中有这些字段(电子邮件和位置),可以称之为/ users

因此,用户端点看起来像:

{
  "randomID1":{
    email: "some...@google.com",
    location: "San Jose, CA"
  },
  "randomID2":{
    email: "anothe...@fb.com",
    location: "Menlo Park, CA"
  }
}


我必须使用上述对象并为firebase动态生成查询,这就是我所拥有的:

return $q(function(resolve, reject) {
            ref.orderByChild("email");
            for(var key in filterObject){
                if(filterObject.hasOwnProperty(key)){
                    console.log("Key: ",key);
                    console.log("Value: ",filterObject[key]);
                    ref.equalTo(""+filterObject[key],""+key);
                }
            }
            return ref.on("value", function (snapshot) {
                resolve(snapshot.val());
            }, function (errorObject) {
                reject(errorObject);
            });
        });


这总是返回我所有的数据,并没有真正过滤任何内容。有人可以在这里提供建议吗?我是Firebase的新手,如果这是一个幼稚的问题,对不起。

谢谢

最佳答案

经过一番尝试,我找到了答案。
基本上,Firebase不允许在多个属性上进行查询,因此我在第一个属性上查询firebase,如果还有更多属性需要查询,我会使用下划线js来过滤其余属性。

代码如下:

return $q(function(resolve, reject) {
            var query = ref ;
            for(var key in filterObject){
                if(filterObject.hasOwnProperty(key)){
                    query = query.orderByChild(key);
                    query = query.equalTo(filterObject[key]);
                    delete(filterObject[key]);
                    break; //break out after querying the first property in firebase
                }
            }
            return query.on("value", function (snapshot) {
                var objects = snapshot.val();
                var result = _.filter(objects, function(obj){
                    return _.isMatch(obj, filterObject); //for all other objects I use underscorejs to filter
                });
                resolve(result);
            }, function (errorObject) {
                reject(errorObject);
            });
        });

07-24 09:50
查看更多