2017-10-23 11 views
1

ファイアストアはそれほど古くはないので、いくつかのシナリオでは非常に小さな助けがあります。ファイアストアDBから2番目に最後のレコードを取得する、javascript

Firestoreから2番目の最後のレコードを取得しようとしていますが、それは非常に最初になっています。私はそれが間違っているクエリを知っている:例えば

db.collection("batches") 
    .where('added_at', "<", paymentData.added_at) //Here paymentData is last record 
    .limit(1).get().then(function(prevSnapshot){ 
}) 

私は3つの記録

A. added_at: 1 Jan, 2017 
B. added_at: 2 Jan, 2017 
C. added_at: 3 Jan, 2017 

を持っていると私は今paymentDataにCを持っていると私は、レコードBをしたいです。しかしそれは記録Aを得ている。

どうすれば最後の最後のレコード

EDIT:

各レコードは、常に前のものよりも新しいタイムスタンプを持つことになります(でも、それは1分することができ例えば、前27 Jan, 2017 5:20 PMと新しい27 Jan, 2017 5:21 PM。)

そしてpaymentDataは常に最新のレコードを持っています

は基本的に私は現在の支払前回の支払いの2つの値を比較し、それがユーザーとの違いだ表示したいです。

答えて

2

具体的にはorder the documents in your queryを除き、Firestoreの文書の順序は保証されません。これを行うには、orderBy()メソッドを使用する必要があります。例えば

、あなたはB、ご希望の結果を返すべき、データベースが降順にadded_atフィールドでドキュメントをソートすることを指定することができます。

db.collection("batches") 
    .orderBy('added_at', 'desc') // Order documents by added_at field in descending order 
    .where('added_at', "<", paymentData.added_at) 
    .limit(1).get().then(function(prevSnapshot){ 
      // ... 
    }) 

は、しかし注意してください:同じタイムスタンプを持つ複数のドキュメント、またはあなたが期待しているものの間のタイムスタンプは、あなたが期待したものとは異なる文書を受け取ることを意味するかもしれないので、私はこれを利用して特定の文書を選ぶことはしません。

+0

Nop Sir、それは私に文書Aを与えています。 'A's'' added_at'は' 2017年12月13日午後12時13分17秒 '、' B's' added_atは '2017年10月21日12:11:54に' 'C's' added_atは' 2017年10月21日12:09:42 PMに ' –

+0

しかし、彼らも'タイムスタンプ 'と一緒に子を入れ子に入れている、それは問題を作りますか? –

+0

あなたのコメントの順序はあなたの質問と逆です。そのため、ソート順を '.orderBy( '​​added_at'、 'asc')'に変更する必要があります。また、ネストされた子のタイムスタンプは、順序が 'added_at'フィールドのみに基づいているので、ここでは重要ではありません。 – Grimthorr

関連する問題