2017-06-06 3 views
1

各レコードのフィールドの1つでソートされたレコードのリストを取得しようとしていますが、ページ内のデータを取得できるようにしたいと考えています。子による注文時にstartAt()を使用するページ分割

Firebase documentationによれば、reference.startAt()方法は、オプション2のパラメータがあります

The child key to start at. This argument is only allowed if ordering by child, value, or priority.

まずオフ、ここでデータは次のとおり

{ 
    "products" : { 
    "-KlsqFgVWwUrA-j0VsZS" : { 
     "name" : "Product 4", 
     "price" : 666 
    }, 
    "-Klst-cLSckuwAuNAJF8" : { 
     "name" : "Product 1", 
     "price" : 100 
    }, 
    "-Klst7IINdt8YeMmauRz" : { 
     "name" : "Product 2", 
     "price" : 50 
    }, 
    "-Klst9KfM2QWp8kXrOlR" : { 
     "name" : "Product 6", 
     "price" : 30 
    }, 
    "-KlstB51ap1L2tcK8cL6" : { 
     "name" : "Product 5", 
     "price" : 99 
    }, 
    "-KlstDR5cCayGH0XKtZ0" : { 
     "name" : "Product 3", 
     "price" : 500 
    } 
    } 
} 

そしてここでは、コードされページ1(最低価格商品+第2最低価格+第3最低価格):

(私はFirebase JS SDK 4.1.1を使用しています)

'use strict'; 
var firebase = require('firebase'); 

firebase.initializeApp({ 
    apiKey: "your-api-key", 
    authDomain: "your-firebase-domain", 
    databaseURL: "https://your-db.firebaseio.com", 
    projectId: "your-project", 
    storageBucket: "your-bucket.appspot.com", 
    messagingSenderId: "your-sender-id" 
}) 

firebase.database().ref('products') 
.orderByChild('price') 
.limitToFirst(3) 
.on('child_added', function (snapshot) { 
    var key = snapshot.key; 
    var data = snapshot.val(); 
    console.log(key + ': ' + JSON.stringify(data)) 
}) 

出力:

TJ:データベースtjwoonの$ノードtest.js

-Klst9KfM2QWp8kXrOlR: {"name":"Product 6","price":30} 
-Klst7IINdt8YeMmauRz: {"name":"Product 2","price":50} 
-KlstB51ap1L2tcK8cL6: {"name":"Product 5","price":99} 

2ページは第三最低でなければなりません、第4位の最低価格、第5位の最低価格の商品で、私のコードではさらに1行が必要です。

出力:

TJ:database tjwoon$ node test.js 
-Klst9KfM2QWp8kXrOlR: {"name":"Product 6","price":30} 
-Klst7IINdt8YeMmauRz: {"name":"Product 2","price":50} 
-KlstB51ap1L2tcK8cL6: {"name":"Product 5","price":99} 

問題は、それが再び1ページを返しているということです。ドキュメントが正しい場合、結果はキー-KlstB51ap1L2tcK8cL6のレコードから開始されます。

価格フィールドに.indexOnルールを追加しようとしましたが、結果は同じです。

私はorderByChild()行を削除すると、結果が与えられたキーから起動しますが、もちろんソートが間違っている、プラスそれはドキュメントに反し振る舞う...

私はこれらの他のスタックオーバーフローの記事を見つけました

しかし、これらの質問に対する回答はなく、回答はほとんどありません。 Githubリポジトリには、検索用語startatと一致する問題はありません。

誰かが同じ問題に直面していますか?この問題は、並べ替えられた方法で並べ替えられたリストを取得することが不可能になります...

+0

第2回StackOverflow質問:https://stackoverflow.com/questions/36779947/firebase-querying-when-combining-orderbychild-startat-and-limittofirst?rq=1 – tjwoon

答えて

2

ほとんどあなたがあります!

問題は、2ページ目のstartAtを呼び出す方法です:

.startAt(null, '-KlstB51ap1L2tcK8cL6') 

あなたは価格と、いわゆるアンカーアイテムのキーの両方に合格する必要があり、正しい結果を取得するには、次の

をそのFirebaseで
.startAt(99, '-KlstB51ap1L2tcK8cL6') 

price99を持つすべての項目を検索し、キー'-KlstB51ap1L2tcK8cL6'で始まる項目を返します。

+0

ありがとうございます!第1パラメータが「主な」開始基準であるように見えます。第2パラメータは、複数の子が同じ値を持つ場合の一種の曖昧さ回避値として機能します。これはすごく、ありがとう! – tjwoon

+0

この機能をREST経由で使用する方法を知りたいです。誰かが助けることができるなら、これは私がhttps://stackoverflow.com/questions/45909798/how-use-firebase-startat-method-with-value-and-key-in-rest-requestで尋ねるものです。 –

関連する問題