Node Firebase で一意のランダムなプロダクトを取得する方法
Firebase は柔軟なデータ構造を提供し、データを階層的に保存できます。シナリオによっては、膨大な数のレコードがある場合でも、必要なのは一意でランダムなレコードが 1 つだけであることです。この記事では、Node Firebase でこれを実現するための 2 つのアプローチについて説明します。
従来のアプローチ: すべてのレコードをダウンロードする
データベース構造が次のようなものであると仮定します。
Firebase-root | --- products | --- productIdOne | | | --- name: "gjwj" | | | --- category: "hreggrrg" | | | --- location: "vjhiwehifwe" | | | --- price: 44 | | | --- color: "fassaf" | --- productIdTwo | | | --- name: "uygfwh" | | | --- category: "hhhjwwwom" | | | --- location: "pervrr" | | | --- price: 33 | | | --- color: "yrtrr" | --- //And so on
ランダムな製品を取得するには、次のコードを実装できます。
<code class="javascript">var listView = (ListView) findViewById(R.id.list_view); var arrayAdapter = new ArrayAdapter(context, android.R.layout.simple_list_item_1, randomProductList); listView.setAdapter(arrayAdapter); var rootRef = FirebaseDatabase.getInstance().getReference(); var productsRef = rootRef.child("products"); var valueEventListener = new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { var productList = new ArrayList(); for(var ds : dataSnapshot.getChildren()) { var name = ds.child("name").getValue(String.class); productList.add(name); } var productListSize = productList.size(); var randomProductList = new ArrayList(); randomProductList.add(new Random().nextInt(productListSize)); arrayAdapter.notifyDatasetChanged(); } @Override public void onCancelled(DatabaseError databaseError) { Log.d(TAG, "Error: ", task.getException()); //Don't ignore errors! } }; productsRef.addListenerForSingleValueEvent(valueEventListener);</code>
すべての製品を反復処理することで、リストを作成し、そのリスト内にランダムなインデックスを生成できます。は、選択した製品を表します。
最適化されたアプローチ: フルレコードのダウンロードを回避
データの取得を最小限に抑えるために、次のようにデータベースを再構築できます:
Firebase-root | --- products | | | --- productIdOne | | | | | --- //details | | | --- productIdTwo | | | --- //details | --- productIds | --- productIdOne: true | --- productIdTwo: true | --- //And so on
ここでは、productIds という別のノードを作成します。このノードには、製品の ID のみが含まれます。ランダムな製品を取得するには:
<code class="javascript">var rootRef = FirebaseDatabase.getInstance().getReference(); var productIdsRef = rootRef.child("productIds"); var valueEventListener = new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { var productIdsList = new ArrayList(); for(var ds : dataSnapshot.getChildren()) { var productId = ds.getKey(); productIdsList.add(productId); } var productListSize = productList.size(); var randomProductList = new ArrayList();); var productIdRef = rootRef.child("products").child(productIdsList.get(new Random().nextInt(int productListSize)); var eventListener = new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { var name = dataSnapshot.child("name").getValue(String.class); Log.d("TAG", name); } @Override public void onCancelled(DatabaseError databaseError) { Log.d(TAG, "Error: ", task.getException()); } }; productIdRef.addListenerForSingleValueEvent(eventListener); } @Override public void onCancelled(DatabaseError databaseError) { Log.d(TAG, "Error: ", task.getException()); } }; productIdsRef.addListenerForSingleValueEvent(valueEventListener);</code>
最初に製品 ID を取得すると、特定の製品をクエリできるため、より効率的で的を絞った取得プロセスが実現します。
以上がNode.js で大規模な Firebase データセットからランダムな製品を効率的に取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。