【问题标题】:Filter child node query on AngularFire2 firebase在 AngularFire2 firebase 上过滤子节点查询
【发布时间】:2017-09-22 02:51:40
【问题描述】:

我的 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,
      }
    });
  }

如何获得此列表?正在返回空。

【问题讨论】:

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


    【解决方案1】:

    只能查询一个字段;

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

    【讨论】:

    • 但我需要按“cnpj”过滤。我试过“orderByChild:'fornecedor/cnpj'”但我做不到
    • cnpj 有值还是你的父节点之一?如果它是父节点并且您只想使用 cnpj 过滤结果,那么您可以将其添加到您的查询中:query: { orderByChild: "cnpj'" }
    • 相反,orderByKey 会根据查询结果的升序键值对查询结果进行排序。
    • 它有一个值。我必须以这种方式过滤列表:CNPJ = 123
    • 很好,然后查询:{ orderByChild: 'CNPJ', equalTo: 123 } 就可以了!
    【解决方案2】:

    鉴于您的 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

    【讨论】:

    • 对不起。我的查询只过滤一个字段。我不需要过滤nNF,我只是打错了。正确的是只过滤CNPJ
    • 我试过 orderByChild: 'fornecedor/cnpj',但没有成功。返回一个空列表。
    • 嗯...应该可以工作,尽管您的代码中有一些未知数。你能用硬编码值"123234534534"替换cnpjFornecedor 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    • 2023-03-09
    • 2017-06-05
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    相关资源
    最近更新 更多