2017-10-23 4 views
1

파이어 스토어는 그리 오래되지 않았기 때문에 일부 시나리오에서는 매우 작은 도움이 있습니다.파이어 스토어 DB에서 두 번째 마지막 레코드 얻기, 자바 스크립트

Firestore에서 두 번째 마지막 레코드를 얻으려고 시도하지만 매우 처음입니다. 내가 잘못 쿼리 알고 : 예를 들어

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입니다.

어떻게 얻을 수 있습니까 두 번째 마지막 기록?

편집 :

각 레코드는 항상 이전보다 이후에 타임 스탬프를해야합니다 (심지어는 1 분 할 수 있습니다 예를 들어, 이전 27 Jan, 2017 5:20 PM 새로운 27 Jan, 2017 5:21 PM.)

그리고 paymentData 항상 최신 기록을해야합니다 .

기본적으로 내가 현재 지불이전 지불 두 값을 비교하고 사용자에게 차이점 표시합니다.

답변

2

구체적으로 order the documents in your query을 제외하고 Firestore 문서의 순서는 보장되지 않습니다. 이렇게하려면 orderBy() 방법을 사용해야합니다.

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){ 
      // ... 
    }) 

그래도주의 :

예를 들어, 원하는 결과, B을 반환해야하는, 내림차순으로 데이터베이스가 added_at 필드를 기준으로 문서를 정렬하도록 지정할 수 있습니다 동일한 타임 스탬프 여러 문서를 , 또는 예상 시간대 사이의 타임 스탬프를 사용하면 예상보다 다른 문서를받을 수 있으므로 특정 문서를 선택하는 데 의존하지 않을 것입니다.

+0

Nop Sir, 문서 A를 제공합니다. 'A'''' added_at'은'2017 년 12 월 13 일 17:17에''B's' added_at은'2017 년 10 월 21 일 12:11:54에''C''' added_at은'2017 년 10 월 21 일입니다. 12:09:42 PM에' –

+0

그러나 그들은 타임 스탬프로 중첩 된 자식도 가지고 있습니다. 문제가 있습니까? –

+0

댓글의 순서는 질문의 순서와 반대이므로 정렬 순서를'.orderBy ('added_at', 'asc')'로 변경해야합니다. 또한 중첩 된 자식의 타임 스탬프는 순서가 'added_at' 필드를 기반으로하기 때문에 여기서는 중요하지 않습니다. – Grimthorr

관련 문제