Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firebase查询过滤器并选择_Javascript_Firebase_Firebase Realtime Database - Fatal编程技术网

Javascript Firebase查询过滤器并选择

Javascript Firebase查询过滤器并选择,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我的数据如下: "orders": { "-L6ue92e4DQ7Mm-veRxN" : { "customer" : { "address" : { "country" : "", "postCode" : "CB2 3AW", "street" : "86 High Street" }, "email" : "poo@gmail.com", "name" : "Pooh" },

我的数据如下:

"orders":
{
  "-L6ue92e4DQ7Mm-veRxN" : {
    "customer" : {
      "address" : {
        "country" : "",
        "postCode" : "CB2 3AW",
        "street" : "86 High Street"
      },
      "email" : "poo@gmail.com",
      "name" : "Pooh"
    },
    "deliveryMethod" : "fastest",
    "ingredients" : [ {
      "Ingredient" : "cheese",
      "Price" : 0.3,
      "Quantity" : 1
    }, {
      "Ingredient" : "meat",
      "Price" : 1,
      "Quantity" : 2
    } ],
    "price" : 6.3
  },

  "-L6ueB632CCTKhGbbGLC" : {
    "customer" : {
      "address" : {
        "country" : "",
        "postCode" : "CB2 3AW",
        "street" : "86 High Street"
      },
      "email" : "poo@gmail.com",
      "name" : "Pooh"
    },
    "deliveryMethod" : "fastest",
    "ingredients" : [ {
      "Ingredient" : "relish",
      "Price" : 0.15,
      "Quantity" : 1
    }, {
      "Ingredient" : "bacon",
      "Price" : 0.4,
      "Quantity" : 1
    }, {
      "Ingredient" : "meat",
      "Price" : 1,
      "Quantity" : 2
    } ],
    "price" : 6.55
  },

  "-L6ueD9A2VuZUrM1hAFf" : {
    "customer" : {
      "address" : {
        "country" : "",
        "postCode" : "CB2 3AW",
        "street" : "86 High Street"
      },
      "email" : "poo@gmail.com",
      "name" : "Pooh"
    },
    "deliveryMethod" : "fastest",
    "ingredients" : [ {
      "Ingredient" : "meat",
      "Price" : 1,
      "Quantity" : 2
    }, {
      "Ingredient" : "salad",
      "Price" : 0.2,
      "Quantity" : 1
    } ],
    "price" : 6.2
  }
}
db.ref('orders')
        .orderByChild("customer/email")
        .equalTo(req.query.email)
        .once('value')
orderByChild("customer").equalTo(namehere);
orderByChild("time").startAt(5).endAt(5\uf8ff);
我想选择电子邮件地址与我的条件匹配的订单,然后只返回配料节点

我可以通过电子邮件进行过滤,然后获得整个订单节点,如下所示:

"orders":
{
  "-L6ue92e4DQ7Mm-veRxN" : {
    "customer" : {
      "address" : {
        "country" : "",
        "postCode" : "CB2 3AW",
        "street" : "86 High Street"
      },
      "email" : "poo@gmail.com",
      "name" : "Pooh"
    },
    "deliveryMethod" : "fastest",
    "ingredients" : [ {
      "Ingredient" : "cheese",
      "Price" : 0.3,
      "Quantity" : 1
    }, {
      "Ingredient" : "meat",
      "Price" : 1,
      "Quantity" : 2
    } ],
    "price" : 6.3
  },

  "-L6ueB632CCTKhGbbGLC" : {
    "customer" : {
      "address" : {
        "country" : "",
        "postCode" : "CB2 3AW",
        "street" : "86 High Street"
      },
      "email" : "poo@gmail.com",
      "name" : "Pooh"
    },
    "deliveryMethod" : "fastest",
    "ingredients" : [ {
      "Ingredient" : "relish",
      "Price" : 0.15,
      "Quantity" : 1
    }, {
      "Ingredient" : "bacon",
      "Price" : 0.4,
      "Quantity" : 1
    }, {
      "Ingredient" : "meat",
      "Price" : 1,
      "Quantity" : 2
    } ],
    "price" : 6.55
  },

  "-L6ueD9A2VuZUrM1hAFf" : {
    "customer" : {
      "address" : {
        "country" : "",
        "postCode" : "CB2 3AW",
        "street" : "86 High Street"
      },
      "email" : "poo@gmail.com",
      "name" : "Pooh"
    },
    "deliveryMethod" : "fastest",
    "ingredients" : [ {
      "Ingredient" : "meat",
      "Price" : 1,
      "Quantity" : 2
    }, {
      "Ingredient" : "salad",
      "Price" : 0.2,
      "Quantity" : 1
    } ],
    "price" : 6.2
  }
}
db.ref('orders')
        .orderByChild("customer/email")
        .equalTo(req.query.email)
        .once('value')
orderByChild("customer").equalTo(namehere);
orderByChild("time").startAt(5).endAt(5\uf8ff);
然后返回过滤后的订单

但是equalTo返回一个查询。ref是对该查询位置的引用。所以我希望能够做到这一点:

db.ref('orders')
        .orderByChild("customer/email")
        .equalTo(req.query.email)
        .ref
        .child('ingredients')
        .once('value')
但它返回空值。由于我是新来的(从SQL开始),我不知道该怎么办。我可能会在。然后的。一次中做点什么,但那似乎效率低下。我走错方向了吗

还有,我必须做orderByChild吗?我能不能不点菜就过滤邮件


这都是React SPA web应用程序的一部分。

您需要根据查询内容更改数据库结构,但这不起作用:

 db.ref('orders')
    .orderByChild("customer/email")
    .equalTo(req.query.email)
    .ref
    .child('ingredients')
    .once('value')
此外,您只能使用一个查询(一个
orderByChild()
),并且在筛选时必须使用orderByChild

您有如下不同的查询:

"orders":
{
  "-L6ue92e4DQ7Mm-veRxN" : {
    "customer" : {
      "address" : {
        "country" : "",
        "postCode" : "CB2 3AW",
        "street" : "86 High Street"
      },
      "email" : "poo@gmail.com",
      "name" : "Pooh"
    },
    "deliveryMethod" : "fastest",
    "ingredients" : [ {
      "Ingredient" : "cheese",
      "Price" : 0.3,
      "Quantity" : 1
    }, {
      "Ingredient" : "meat",
      "Price" : 1,
      "Quantity" : 2
    } ],
    "price" : 6.3
  },

  "-L6ueB632CCTKhGbbGLC" : {
    "customer" : {
      "address" : {
        "country" : "",
        "postCode" : "CB2 3AW",
        "street" : "86 High Street"
      },
      "email" : "poo@gmail.com",
      "name" : "Pooh"
    },
    "deliveryMethod" : "fastest",
    "ingredients" : [ {
      "Ingredient" : "relish",
      "Price" : 0.15,
      "Quantity" : 1
    }, {
      "Ingredient" : "bacon",
      "Price" : 0.4,
      "Quantity" : 1
    }, {
      "Ingredient" : "meat",
      "Price" : 1,
      "Quantity" : 2
    } ],
    "price" : 6.55
  },

  "-L6ueD9A2VuZUrM1hAFf" : {
    "customer" : {
      "address" : {
        "country" : "",
        "postCode" : "CB2 3AW",
        "street" : "86 High Street"
      },
      "email" : "poo@gmail.com",
      "name" : "Pooh"
    },
    "deliveryMethod" : "fastest",
    "ingredients" : [ {
      "Ingredient" : "meat",
      "Price" : 1,
      "Quantity" : 2
    }, {
      "Ingredient" : "salad",
      "Price" : 0.2,
      "Quantity" : 1
    } ],
    "price" : 6.2
  }
}
db.ref('orders')
        .orderByChild("customer/email")
        .equalTo(req.query.email)
        .once('value')
orderByChild("customer").equalTo(namehere);
orderByChild("time").startAt(5).endAt(5\uf8ff);
请尝试此数据库:

customers
  customerid
     email:poo@gmail.com
     name:Pooh
     address  
      country:countryname
      postCode"CB2 3AW
      street:86 High Street
   customerid2
         /*some data here for other customer */

现在您可以执行以下操作:

firebase.database().ref().child("orders").orderByChild("customeremail").equalTo("poo@gmail.com").once('value').then(function(snapshot) {
snapshot.forEach(function(child) { 
var ingredients=child.val().Ingredient;

   )};
 )};

您需要根据查询的内容更改数据库的结构,这是行不通的:

 db.ref('orders')
    .orderByChild("customer/email")
    .equalTo(req.query.email)
    .ref
    .child('ingredients')
    .once('value')
此外,您只能使用一个查询(一个
orderByChild()
),并且在筛选时必须使用orderByChild

您有如下不同的查询:

"orders":
{
  "-L6ue92e4DQ7Mm-veRxN" : {
    "customer" : {
      "address" : {
        "country" : "",
        "postCode" : "CB2 3AW",
        "street" : "86 High Street"
      },
      "email" : "poo@gmail.com",
      "name" : "Pooh"
    },
    "deliveryMethod" : "fastest",
    "ingredients" : [ {
      "Ingredient" : "cheese",
      "Price" : 0.3,
      "Quantity" : 1
    }, {
      "Ingredient" : "meat",
      "Price" : 1,
      "Quantity" : 2
    } ],
    "price" : 6.3
  },

  "-L6ueB632CCTKhGbbGLC" : {
    "customer" : {
      "address" : {
        "country" : "",
        "postCode" : "CB2 3AW",
        "street" : "86 High Street"
      },
      "email" : "poo@gmail.com",
      "name" : "Pooh"
    },
    "deliveryMethod" : "fastest",
    "ingredients" : [ {
      "Ingredient" : "relish",
      "Price" : 0.15,
      "Quantity" : 1
    }, {
      "Ingredient" : "bacon",
      "Price" : 0.4,
      "Quantity" : 1
    }, {
      "Ingredient" : "meat",
      "Price" : 1,
      "Quantity" : 2
    } ],
    "price" : 6.55
  },

  "-L6ueD9A2VuZUrM1hAFf" : {
    "customer" : {
      "address" : {
        "country" : "",
        "postCode" : "CB2 3AW",
        "street" : "86 High Street"
      },
      "email" : "poo@gmail.com",
      "name" : "Pooh"
    },
    "deliveryMethod" : "fastest",
    "ingredients" : [ {
      "Ingredient" : "meat",
      "Price" : 1,
      "Quantity" : 2
    }, {
      "Ingredient" : "salad",
      "Price" : 0.2,
      "Quantity" : 1
    } ],
    "price" : 6.2
  }
}
db.ref('orders')
        .orderByChild("customer/email")
        .equalTo(req.query.email)
        .once('value')
orderByChild("customer").equalTo(namehere);
orderByChild("time").startAt(5).endAt(5\uf8ff);
请尝试此数据库:

customers
  customerid
     email:poo@gmail.com
     name:Pooh
     address  
      country:countryname
      postCode"CB2 3AW
      street:86 High Street
   customerid2
         /*some data here for other customer */

现在您可以执行以下操作:

firebase.database().ref().child("orders").orderByChild("customeremail").equalTo("poo@gmail.com").once('value').then(function(snapshot) {
snapshot.forEach(function(child) { 
var ingredients=child.val().Ingredient;

   )};
 )};

我不确定我是否理解你的问题。听起来你有一个开始工作的解决方案,但你只是想知道为什么你不能用另一种方式来做事情?@Doug,是的,我可以通过返回整个订单节点,然后在客户端上使用我想要的部分来让它工作,但我不想通过电线发送所有信息,这是一种浪费。@Peter,是的,我可以这样做,仍然很奇怪,我不能有效地查询父节点,即我想要父节点具有特定属性的所有子节点。另外,我也不完全理解为什么这个链条不起作用。接口指南将.ref显示为对查询的引用。根据该指南,引用有许多方法,包括child,它再次返回一个引用,它有另一个方法。这一逻辑哪里错了?您过滤执行此orderByKey()的父级。equalTo(…)@user2047485下面的答案是推荐的方法,使用您提供的电子邮件可以更轻松地获取值。另外最好不要嵌套数据库,应该是平面的,请阅读以下内容:。另外,请投票选出正确答案,因为它有帮助,谢谢!在这种结构下,您肯定会在订单中使用customerid,而不是客户电子邮件?然后,我必须通过在电子邮件上查询客户,然后使用该客户ID获取订单来获取客户ID。。。我认为答案是我不能选择子节点作为集合(即在本例中每个订单上的配料节点),对吗?我可以选择一个特定的成分节点,或者我可以选择一个路径的所有子节点(即在本例中为orders),一旦我选择了,我只能返回完整的对象。我不确定我是否理解您的问题。听起来你有一个开始工作的解决方案,但你只是想知道为什么你不能用另一种方式来做事情?@Doug,是的,我可以通过返回整个订单节点,然后在客户端上使用我想要的部分来让它工作,但我不想通过电线发送所有信息,这是一种浪费。@Peter,是的,我可以这样做,仍然很奇怪,我不能有效地查询父节点,即我想要父节点具有特定属性的所有子节点。另外,我也不完全理解为什么这个链条不起作用。接口指南将.ref显示为对查询的引用。根据该指南,引用有许多方法,包括child,它再次返回一个引用,它有另一个方法。这一逻辑哪里错了?您过滤执行此orderByKey()的父级。equalTo(…)@user2047485下面的答案是推荐的方法,使用您提供的电子邮件可以更轻松地获取值。另外最好不要嵌套数据库,应该是平面的,请阅读以下内容:。另外,请投票选出正确答案,因为它有帮助,谢谢!在这种结构下,您肯定会在订单中使用customerid,而不是客户电子邮件?然后,我必须通过在电子邮件上查询客户,然后使用该客户ID获取订单来获取客户ID。。。我认为答案是我不能选择子节点作为集合(即在本例中每个订单上的配料节点),对吗?我可以选择一个特定的成分节点,或者我可以选择一个路径的所有子节点(即在本例中为orders),一旦我这样做,我只能返回完整的对象