在AngularFire2 firebase上过滤子节点查询

时间:2017-09-22 02:51:41

标签: javascript angular firebase firebase-realtime-database angularfire2

我的firebase中有这个数据结构。

  "produtos" : {
    "3" : {
      "data" : "2017-09-21",
      "fornecedor" : {
        "cnpj" : "123234534534",
        "fantasia" : "Barreirinha"
      },
      "nNF" : 3,
      "peso" : 3,
      "precoCompra" : 6,
      "vendido" : false
    },
    "123" : {
      "data" : "2017-09-14",
      "fornecedor" : {
        "cnpj" : "123234534534",
        "fantasia" : "Barreirinha"
      },
      "nNF" : 123,
      "peso" : 23000,
      "precoCompra" : 2.21,
      "vendido" : false
    }
  }

我需要获取包含CNPJ键的对象值列表。

我使用的是Angular,AngularFire2和TypeScript,但我无法理解。

retrieveProdutos(cnpjFornecedor: string) {
    this.produtos = this.db.list(this.paths.pathProduto, {
      query: {
        orderByChild: 'cnpj',
        equalTo: cnpjFornecedor,
        orderByKey: true,
      }
    });
  }

如何获取此列表?回来了。

2 个答案:

答案 0 :(得分:0)

您只能查询一个字段;

query: {
  orderByChild: "vendido",
  equalTo: "false" 
}
例如,

将为您提供vendido子键设置为false的所有子节点。

此外,如果您想访问每个子值,您可以执行以下操作:

this.produtos.subscribe(produtos => {

    produtos.forEach(produto => {

        console.log("produto:", produto);

        // And here you can access each produto data 

    });
});

或者,取决于您访问数据库:

 yourRef.on("value", (snapshot) => {

       snapshot.forEach((child) => {

                var produto = child.val();

                console.log("produto nNF", produto.nNF);

        });

});

答案 1 :(得分:0)

鉴于您的JSON,您将通过已知路径上的嵌套属性进行过滤。这可以通过在查询中指定属性的路径来实现:

retrieveProdutos(cnpjFornecedor: string) {
    this.produtos = this.db.list(this.paths.pathProduto, {
      query: {
        orderByChild: 'fornecedor/cnpj',
        equalTo: cnpjFornecedor
      }
    });
  }

更新:在第二次阅读时,您说您要返回值为nNF的项目。在这种情况下,您可以使用以下内容进行过滤:

retrieveProdutos(cnpjFornecedor: string) {
    this.produtos = this.db.list(this.paths.pathProduto, {
      query: {
        orderByChild: 'nNF',
        startAt: 0
      }
    });
  }

您需要注意的是,Firebase数据库查询只能对单个属性进行排序/过滤。在许多情况下,可以将要过滤的值组合到单个(合成)属性中。有关此方法和其他方法的示例,请参阅我的答案:http://stackoverflow.com/questions/26700924/query-based-on-multiple-where-clauses-in-firebase