2015-10-22 87 views
1

我有這種用例,我必須根據用戶以對象形式發出的參數進行查詢。用戶可以發出多個參數進行查詢。它與SQL中的「SELECT * FROM users WHERE FIRST_NAME ='something'AND LAST_NAME ='something'」類似。使用firebase動態查詢

的樣本對象可以是:

var object= { 
    email: "[email protected]", 
    location: "San Jose, CA" 
}; 

我有我的火力點數據,這些字段(電子郵件&位置),在一些端點讓叫它/用戶

所以用戶端點將如下所示:

{ 
    "randomID1":{ 
    email: "[email protected]", 
    location: "San Jose, CA" 
    }, 
    "randomID2":{ 
    email: "[email protected]", 
    location: "Menlo Park, CA" 
    } 
} 

我必須使用上述對象,並​​動態地火力生成查詢,這是我有:

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的新手,對不起,如果這是一個天真的問題。

謝謝

+0

你訂購火力地堡服務器上的數據,但你不在那裏對其進行篩選。你需要添加類似'equalTo()'的東西。有關所有信息,請閱讀Firebase文檔的此頁面:https://www.firebase.com/docs/web/guide/retrieving-data.html#section-queries。 –

+2

@FrankvanPuffelen感謝您的回覆。我想我真正想要的是這個http://stackoverflow.com/questions/26700924/query-based-on-multiple-where-clauses-in-firebase –

+0

但請注意,Firebase服務器只允許查詢單個屬性。見http://stackoverflow.com/questions/30654872/how-to-query-based-on-multiple-conditions-in-firebase –

回答

1

經過一番嘗試,我找到了答案。 基本上,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); 
      }); 
     });