如何对 firebase 进行 select 查询

how to make a select query to firebase

我正在使用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;
};

我注意到在可变文本中有所有 objects 所以我得到了包含文本的所有内容。我想要的只是来自文本的 select 名称 :)

谢谢

当您通过其大部分 API 访问 Firebase 时,它​​总是会检索完整的节点。所以你不能告诉它只检索属性的一个子集。

这意味着如果您真的只想要标题,则必须以不同的方式对数据建模。现在你有这样的东西:

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

那些 -J 是 Firebase 在您调用 push 时生成的密钥。

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

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

要向上述结构中添加一个新的 post,您需要执行如下操作:

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

所以我们先把新post的正文添加到texts节点,然后用同样的键在titles节点下添加标题

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