如何对firebase进行选择查询

时间:2015-02-20 15:42:51

标签: angularjs firebase angularfire

我正在使用angularfire。 我的节点在firebase / texts /中就像那样松散:

{ title: 'title', text: 'long text' }

在我的服务中,我想获得标题,因为我想显示标题列表,我不想在此刻加载文本,因为通常是一个很长的文本。 我的服务看起来像这样:

var ref= new Firebase( FBURL+'/texts' );
var sync = $firebase(ref);
var text = sync.$asArray();

this.getTitle = function(){
    var deferred = $q.defer();
    var titles = [];
    text.$loaded().then(function(data){
        lodash.forEach(data, function(item){
            titles.push({title: item.title});
        });
        deferred.resolve(titles);

    })
    .catch(function(err){
        $state.go('login');
        deferred.reject(err);
    });
    return deferred.promise;
};

我注意到在变量文本中有所有对象,所以我得到的所有内容都包含在文本中。我想要的只是文本中的选择名称:)

由于

1 个答案:

答案 0 :(得分:3)

当您通过大多数API访问Firebase时,它将始终检索完整的节点。因此,您无法告诉它只检索属性的子集。

这意味着如果您真的只想要这些标题,则必须对数据进行不同的建模。现在你有这样的事情:

posts
  -Jas73489342
    title: "how to make a select query using firebase"
    text: "...."
  -Jasa8324023
    title: "bicycling the grand canyon"
    text: "..."

当你致电push时,那些-J是Firebase生成的密钥。

为了能够只检索标题,您需要确保有一个节点只包含标题。因此,让我们将posts分成两个独立的节点:titlestexts

titles
  -Jas73489342: "how to make a select query using firebase"
  -Jasa8324023: "bicycling the grand canyon"
texts
  -Jas73489342: "...."
  -Jasa8324023: "..."

要在上述结构中添加新帖子,您可以执行以下操作:

var ref = new Firebase(FBURL),
    titles = ref.child('titles'),
    texts = ref.child('texts'),
    item = { title: 'Petroglyphs in Albuquerqe', text: '...' };
var newItemRef = texts.push(item.text);
var key = newItemRef.key();
var newTitleRef = titles.child(key).set(item.title);

因此,我们首先将新帖子的文本添加到texts节点,然后使用相同的键在titles节点下添加标题。

您也可以保留posts节点,但添加仅包含标题的titles节点。无论哪种方式,您都将拥有一个能够准确表示您想要的节点:标题列表。