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
Firebase 嵌套结构的建模和过滤_Firebase_Firebase Realtime Database - Fatal编程技术网

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

NoSQL中的Total noob将我的手放在Firebase数据库上,当我需要对我的数据库应用过滤器时,出现了一些问题

我的结构与此类似:

{
  "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数据库模型中的工作方式