我正在将 Firebase 用于我的 Angular.js 应用程序。
我正在寻找 Firebase 的 SQL WHERE
语句的等效项。
我在 Firebase 中存储了一系列电视剧,我只想获取具有用户输入名称的电视剧(在示例 searchQuery
中)。
Firebase 支持吗?有这样的东西吗?
var seriesRef = new Firebase('http://{app}.firebaseio.com/series');
var seriesObject = $firebaseObject(seriesRef.query({ name: searchQuery }));
最佳答案
我有一些建议可能会有所帮助:
- 查看Firebase Query documentation 。具体来说,
- 您可以将查询与
.$ref()
结合使用以获得所需的记录。
示例
- 查看此工作 CodePen demo 。
- 我已将您的数据复制到我的一个公共(public) Firebase 实例中。
- 您要查找的查询是
seriesCollectionRef.orderByChild('name').equalTo(seriesName)
- 如果您在输入框中输入“
Avatar: The Last Airbender
”并点击“查找”,您将获得匹配的系列对象。
- 在我的示例中,我扩展了
$firebaseArray
服务,以包含按名称查找特定系列的方法。- 请参阅 extending AngularFire services 的文档.
- 您可以在不扩展服务的情况下完成同样的事情,请参阅最后一个代码片段。
工厂
app.factory('SeriesFactory', function(SeriesArrayFactory, fbUrl) {
return function() {
const ref = new Firebase(`${fbUrl}/series`);
return new SeriesArrayFactory(ref);
}
});
app.factory('SeriesArrayFactory', function($firebaseArray, $q) {
return $firebaseArray.$extend({
findSeries: function(seriesName) {
const deferred = $q.defer();
// query by 'name'
this.$ref()
.orderByChild('name')
.equalTo(seriesName)
.once('value', function(dataSnapshot) {
if (dataSnapshot.exists()) {
const value = dataSnapshot.val();
deferred.resolve(value);
} else {
deferred.reject('Not found');
}
})
return deferred.promise;
}
});
});
Controller
app.controller('HomeController',function($scope, SeriesFactory, fbUrl) {
$scope.seriesName = '';
$scope.findSeries = function() {
const seriesCollection = new SeriesFactory();
seriesCollection
.findSeries($scope.seriesName)
.then(function(data) {
$scope.series = data;
})
.catch(function(error) {
console.error(error);
});
};
});
没有扩展服务
如果不使用工厂, Controller 函数将如下所示:
$scope.findSeriesWithoutFactory = function() {
const seriesRef = new Firebase(`${fbUrl}/series`);
const seriesCollection = $firebaseArray(seriesRef);
seriesCollection.$ref()
.orderByChild('name')
.equalTo($scope.seriesName)
.once('value', function(dataSnapshot) {
if (dataSnapshot.exists()){
$scope.series = dataSnapshot.val();
} else {
console.error('Not found.');
}
});
};
规则
注意:请务必注意,您应该将 ".indexOn": "name"
添加到您的 Firebase 规则中,以便查询高效运行。请参阅Indexing Your Data Firebase 的一部分 Security & Rules Guide了解更多信息。下面是一个例子:
"yourfirebaseapp": {
".read": "...",
".write": "...",
"series": {
".indexOn": "name"
}
}
关于angularjs - Firebase - 按列过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29164753/