【问题标题】:Firebase query filter and selectFirebase 查询过滤器和选择
【发布时间】:2018-08-14 14:20:17
【问题描述】:

我的数据是这样的:

"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')

返回过滤后的订单

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

db.ref('orders')
        .orderByChild("customer/email")
        .equalTo(req.query.email)
        .ref
        .child('ingredients')
        .once('value')

但是返回null。由于我是新手(从 SQL 迁移),我不知道该怎么做。我可能可以在 .once 的 .then 中做一些事情,但这似乎效率低下。我是不是走错路了?

另外,我必须做 orderByChild 吗?我可以不只过滤电子邮件而不订购吗?

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

【问题讨论】:

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

标签: javascript firebase firebase-realtime-database


【解决方案1】:

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

 db.ref('orders')
    .orderByChild("customer/email")
    .equalTo(req.query.email)
    .ref
    .child('ingredients')
    .once('value')

你也只能使用一个查询(一个orderByChild()),是的,过滤时你必须使用orderbychild。

您有不同的查询,例如:

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 */

orders
  orderid
    customeremail: poo@gmail.com
    deliveryMethod:fastest
    Ingredient: cheese
    Price: 0.3
    Quantity : 1
  orderid1
    customeremail: poo@gmail.com
    deliveryMethod:fastest
    Ingredient : meat
    Price: 1
    Quantity: 2

现在你可以这样做了:

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;

   )};
 )};

【讨论】:

    猜你喜欢
    • 2015-08-19
    • 1970-01-01
    • 2023-03-14
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多