作为firebase中的新手,我试图在这个简单的用例中模仿一种“where子句”请求来检索用户的钱包:
User
48bde8f8-3b66-40bc-b988-566ccc77335c
email: "toto@acme.com"
username: "userTest1"
UserWallet
F4PvtvNT2Z
coins: 26
someList
elemet1
elemet2
user: "48bde8f8-3b66-40bc-b988-566ccc77335c"
首先,我尝试像这样编写我的请求:
Firebase root = new Firebase("https://myApp.firebaseio.com/");
Firebase ref = root.child("UserWallet");
Query query = ref.equalTo("48bde8f8-3b66-40bc-b988-566ccc77335c", "user");
结果是null,所以我写了这个查询:
Query query = ref.orderByChild("user").equalTo("48bde8f8-3b66-40bc-b988-566ccc77335c", "user");
结果再次为null . 检索钱包的唯一方法是使用此查询:
Query query = ref.orderByChild("user").equalTo("48bde8f8-3b66-40bc-b988-566ccc77335c");
那么我以前是否必须始终使用en "orderByChild()"查询才能使用"equalTo()"?
那么,查询的目的是什么"equalTo(String value, String key)"与“equalTo(String value)相比,因为只有第二个才能正常工作?
2 回答
有些边缘情况不需要
orderBy...()
,但通常在过滤操作之前需要orderBy...()
(equalTo()
,startAt()
,endAt()
) .我强烈建议您先阅读Firebase programming guide for Android(其中95%也适用于普通Java) . 在该指南中花费了几个小时,这里将节省数十个问题 . 例如:这是section on queries .
阅读完之后,您可能还想阅读NoSQL Data Modeling上的本指南 . 它涵盖了NoSQL数据建模中的许多常见模式,并将帮助您尽早意识到尝试将SQL查询映射到NoSQL数据库是一个合乎逻辑的想法,但很少是一个好的 .
我的初始(不知道你的用例,除了“我需要能够为用户找到钱包”)模型:
在上面的模型中,我已经将
Wallet
和User
倒置在UserWallet
下,因此为用户查找钱包变得更加容易 .请注意,此处不涉及任何查询,因此无论您在数据库中拥有多少用户,加载都将同样快速 .
或者:
现在我们已经完成了扁平结构 . 要确定用户的钱包,请转至
UserWaller/$uid
,然后从Wallets/$walletid
加载每个钱包 . 它可能是更多的代码,但它将非常有效(因为没有涉及查询) .您可以使用嵌套查询 . 如果您有多个随机ID,您可以轻松比较它们 . DatabaseReference reference = FirebaseDatabase.getInstance() . getReference();