Firebase 嵌套结构的建模和过滤
NoSQL中的Total noob将我的手放在Firebase数据库上,当我需要对我的数据库应用过滤器时,出现了一些问题 我的结构与此类似:Firebase 嵌套结构的建模和过滤,firebase,firebase-realtime-database,Firebase,Firebase Realtime Database,NoSQL中的Total noob将我的手放在Firebase数据库上,当我需要对我的数据库应用过滤器时,出现了一些问题 我的结构与此类似: { "burgers": { "burg-one": { "name": " Burger One" }, "burg-two": { "name": " Burger Two" } }, "ingredients": { "bacon": { "name": "B
{
"burgers": {
"burg-one": {
"name": " Burger One"
},
"burg-two": {
"name": " Burger Two"
}
},
"ingredients": {
"bacon": {
"name": "Bacon",
"burgers": {
"burg-one": true,
"burg-two": true
}
},
"fried-egg": {
"name": "Fried Egg",
"burgers": {
"burg-two": true
}
}
}
}
我正在尝试过滤burg one的所有成分。在Java中,我尝试了下面的代码,但没有成功:
firebaseDatabase()
.child("ingredients")
.orderByChild("burgers")
.equalTo("bacon")
.addListenerForSingleValueEvent(...);
我在这里读了一些关于类似问题的答案,但我不太清楚我应该在这里做什么
建模这些关系的正确方法是否必须复制两个模型中相互关联的列表?在这种情况下,我的汉堡
型号如下:
{
"burgers": {
"burg-one": {
"name": " Burger One",
"ingredients": {
"bacon": true,
}
}
}
这样,我就必须查询成分中的每个元素,才能得到它的数据
如果您对这些问题有任何解释,我们将不胜感激。因此我最终改变了我的结构,需要添加另一系列请求以获取汉堡配料表。结果如下:
{
"burgers": {
"burg-one": {
"name": " Burger One",
"ingredients": {
"bacon": true,
}
},
"burg-two": {
"name": " Burger Two",
"ingredients": {
"bacon": true,
"fried-egg": true
}
}
},
"ingredients": {
"bacon": {
"name": "Bacon",
"burgers": {
"burg-one": true,
"burg-two": true
}
},
"fried-egg": {
"name": "Fried Egg",
"burgers": {
"burg-two": true
}
}
}
}
使用该数据库,我必须对代码进行以下更改:
// Query database to get all burgers and receive in a single value listener
firebaseDatabase()
.child("ingredients")
.orderByChild("burgers")
.equalTo("bacon")
.addListenerForSingleValueEvent(burgersValueEventListener);
// Add received burgers to a list in the database listener
burgersValueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot child : dataSnapshot.getChildren()) {
burgerList.add(child.getValue(Burger.class));
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
Burger burger = burgerList.get(0); // Get a burger to query its ingredients
// Retrieve the burger's ingredient list and query the database for each one it has with a listener
for (String ingredient : burger.ingredients.keySet()) {
firebaseDatabase
.child("ingredients")
.orderByKey()
.equalTo(ingredient)
.addListenerForSingleValueEvent(ingredientValueEventListener);
}
// Receive each (separately) ingredient's details in the listener
ingredientValueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot child : dataSnapshot.getChildren()) {
Ingredient burger = child.getValue(Ingredient.class); // Do something with your ingredient
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
这很好,但我希望我们有一个更简单的方法来实现过滤,但我知道这就是NoSQL数据库模型中的工作方式