如何在Firebase中查询嵌套对象?

时间:2018-04-05 00:06:13

标签: javascript firebase firebase-realtime-database

我正在尝试创建查询字符串,因此来自 Firebase 的响应仅返回具有相应userId的行(不在顶级中)。
目标是仅获取当前登录用户的订单。

我的Javascript对象是这样的:

const order = {
  itemId: "9T9WvJBbHiQpqyWdhBO0yX7lRny1"
  price: 5.3,
  customer: {
    userId: "-L9EyOPFB2PnyAPFUH9M",
    name: "demo user",
    address: "some place in earth",
  }
}

在Firebase中,我有这样的规则:

{
  "rules": {
    "orders": {
      ".read": "auth != null",
      ".write": "auth != null",
      ".indexOn": ["userId"]
    }
  }
}

然而,这显然没有成功,因为索引指向顶层。

以下是我为API调用创建的网址:

const queryParams = `?auth=${token}&orderBy="userId"&equalTo="${userId}"`;

axios
  .get('/orders.json' + queryParams)
  .then(res => {
    // get orders for the currently logged-in user
  })
  .catch(err => {
    console.error(err);
  });

如果我将userId向上移动一级,则完全正常,但客户和经过身份验证的用户使用相同的ID,所以我宁愿将它们保存在一个对象中。

是否可以在Firebase中使用嵌套索引查询数据?
如果是这样,我应该使用什么规则和查询字符串?

1 个答案:

答案 0 :(得分:3)

您希望在orderBy="customer/userId"上订购。

您还需要在该嵌套字段上定义索引,如下所示:

{
  "rules": {
    "orders": {
      ".read": "auth != null",
      ".write": "auth != null",
      ".indexOn": ["customer/userId"]
    }
  }
}

很快就确认最后一个针对Tom's answer here