itsource

게시물을 게시된 순서대로 내림차순으로 표시

mycopycode 2023. 6. 11. 10:38
반응형

게시물을 게시된 순서대로 내림차순으로 표시

이 글을 수 push검색한 데이터를 다음과 같이 표시합니다.

fbl.child('sell').limit(20).on("value", function(fbdata) { 
  // handle data display here
}

문제는 데이터가 가장 오래된 것부터 최신 것 순으로 반환된다는 것입니다. - 저는 그것을 반대의 순서로 원합니다.파이어베이스가 할 수 있습니까?

이 답변이 작성된 이후, Firebase는 임의의 자식 또는 값으로 주문할 수 있는 기능을 추가했습니다.이제 데이터를 정렬하는 네 가지 방법이 있습니다. 키별, 값별, 우선순위별 또는 명명된 자식의 값별입니다.새로운 주문 기능을 소개하는 이 블로그 게시물을 참조하십시오.

기본적인 접근 방식은 다음과 같습니다.

반전 타임스탬프가 있는 하위 속성을 추가한 다음 순서를 지정합니다.

하위 항목을 오름차순으로 읽은 다음 클라이언트에서 반전합니다.

Firebase는 다음 두 가지 방법으로 컬렉션의 하위 노드 검색을 지원합니다.

  • 이름으로
  • 우선적으로

지금 여러분이 얻고 있는 것은 이름으로 된 것입니다. 그것은 연대순입니다.이 아니야 ▁you▁b:: ▁when▁that너.push항목을 컬렉션에 추가할 경우 이름이 생성되어 하위 항목이 이러한 방식으로 정렬되도록 합니다.다음에 대한 Firebase 문서 인용하기:

push()에 의해 생성된 고유 이름 앞에는 클라이언트 생성 타임스탬프가 붙으므로 결과 목록이 시간순으로 정렬됩니다.

순서가 지정된 데이터에 대한 Firebase 가이드에는 다음과 같은 내용이 있습니다.

데이터 정렬 방법

기본적으로 Firebase 노드의 하위 항목은 이름별로 사전순으로 정렬됩니다.용사를 합니다.push()에서는 시간순으로 자연스럽게 정렬되는 하위 이름을 생성할 수 있지만 대부분의 응용 프로그램에서는 다른 방식으로 데이터를 정렬해야 합니다.개발자는 파이어베이스를 사용하여 각 항목에 대한 사용자 정의 우선 순위를 지정하여 목록의 항목 순서를 지정할 수 있습니다.

원하는 동작을 가져오는 가장 간단한 방법은 항목을 추가할 때 항상 감소하는 우선 순위를 지정하는 것입니다.

var ref = new Firebase('https://your.firebaseio.com/sell');
var item = ref.push();
item.setWithPriority(yourObject, 0 - Date.now());

갱신하다

또한 다른 방법으로 어린이를 검색해야 합니다.

fbl.child('sell').startAt().limitToLast(20).on('child_added', function(fbdata) {
  console.log(fbdata.exportVal());
})

내 테스트에서는 다음을 사용합니다.on('child_added'마지막으로 추가된 몇 개의 하위 항목이 시간순 역순으로 반환됩니다.용사를 합니다.on('value'반면에 이름의 순서대로 반환합니다.

사용법을 설명하는 "순서 데이터 읽기" 섹션을 반드시 읽어 보십시오.child_*(순서가 지정된) 하위 항목을 검색하는 이벤트입니다.

이를 보여주는 빈: http://jsbin.com/nonawe/3/watch?js,console

2 에서는 Firebase 2.0.x 를 할 수 .limitLast()달성하기 위해:

fbl.child('sell').orderByValue().limitLast(20).on("value", function(fbdataSnapshot) { 
  // fbdataSnapshot is returned in the ascending order
  // you will still need to order these 20 items in
  // in a descending order
}

발표 링크: Firebase의 추가 쿼리 기능

프랭크의 답변을 강화하기 위해, 우선순위를 사용하여 주문하지 않더라도 단순히 을 사용하여 최신 레코드를 가져올 수도 있습니다.endAt().limit(x)이런 식으로:

var fb = new Firebase(URL);

// listen for all changes and update
fb.endAt().limit(100).on('value', update);

// print the output of our array
function update(snap) {
   var list = [];
    snap.forEach(function(ss) {
       var data = ss.val();
       data['.priority'] = ss.getPriority();
       data['.name'] = ss.name();
       list.unshift(data); 
    });
   // print/process the results...
}

이는 최대 1,000개의 레코드(payload가 작다고 가정할 때)까지도 상당히 성능이 우수합니다.보다 강력한 사용을 위해, Frank의 대답은 신뢰할 수 있고 훨씬 더 확장 가능합니다.

인 힘은 또한 더 큰 나 더 할 수 있도록 될 수 .child_added/child_removed/child_moved신의사건 대신에 value그리고 DOM 업데이트를 개별적으로 적용하는 대신 데바운스를 사용합니다.

DOM 업데이트는 당연히 접근 방식과 상관없이 수백 가지 요소에 들어가면 악취가 나기 때문에 디바운스 접근 방식(또는 기본적으로 우버 디바운스인 React.js 솔루션)은 훌륭한 도구입니다.

정말 방법이 없지만 우리는 재활용품 뷰를 가지고 있는 것처럼 보입니다. 우리는 이것을 가질 수 있습니다.

 query=mCommentsReference.orderByChild("date_added");
        query.keepSynced(true);

        // Initialize Views
        mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
        mManager = new LinearLayoutManager(getContext());
//        mManager.setReverseLayout(false);
        mManager.setReverseLayout(true);
        mManager.setStackFromEnd(true);

        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setLayoutManager(mManager);

날짜 변수(길이)가 있어서 최신 항목을 목록의 맨 위에 보관하려고 합니다.그래서 제가 한 일은:

  • 새 긴 필드 '날짜 추가역'
  • 'getDate'라는 새 메서드를 추가합니다.Long.MAX_VALUE - 날짜만 반환하는 Inverse';
  • .orderByChild("dateInverse")를 사용하여 내 쿼리를 만듭니다.
  • Presto! :p

검색 한도입니다.끝(Intx).이렇게 하면 데이터베이스의 마지막 "x"개의 상위 요소( 오름차순)가 제공되지만 "x"개의 상위 요소가 됩니다.

데이터베이스 {10,300,150,240,2,24,220}에 있는 경우

이 방법:

myFirebaseRef.orderByChild("highScore").limitToLast(4)

검색합니다. {150,220,240,300}

Android에는 어댑터를 통해 객체의 배열 목록에 있는 데이터를 실제로 되돌릴 수 있는 방법이 있습니다.수평 리사이클러 뷰를 사용하여 데이터를 표시했기 때문에 레이아웃 관리자를 사용하여 결과를 내림차순으로 되돌릴 수 없었습니다.다음 매개 변수를 재활용 보기로 설정하면 UI 환경이 엉망이 됩니다.

llManager.setReverseLayout(true);
llManager.setStackFromEnd(true);

이 문제를 해결할 수 있는 유일한 방법은 BindView를 사용하는 것이었습니다.RecyclerView 어댑터의 홀더 방법:

@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
    final SuperPost superPost = superList.get(getItemCount() - position - 1);
}

이 답변이 Firebase에서 이 문제로 어려움을 겪고 있는 모든 개발자에게 도움이 되기를 바랍니다.

파이어베이스:각 요청에 대한 제한과 "추가 로드" 버튼 표시기를 사용하여 항목 스레드를 역순으로 표시하는 방법.

  • 목록의 마지막 10개 항목을 가져옵니다.

FBRef.child("childName") .limitToLast(loadMoreLimit) // loadMoreLimit = 10 예

  • 이것은 마지막 10개의 아이템을 얻을 것입니다.목록에 있는 마지막 레코드의 id를 가져와 더 많은 기능을 로드할 수 있도록 저장합니다.그런 다음 개체 컬렉션을 및 배열로 변환하고 list.reverse()를 수행합니다.

  • 로드 추가 기능:다음 통화는 두 가지 작업을 수행합니다. 첫 번째 요청에서 참조 ID를 기반으로 한 목록 항목의 다음 순서를 가져오고 "추가 로드" 버튼을 표시해야 할 경우 표시기를 제공합니다.

this.FFref.child("childName") .endAt(null, lastThreadId) // 이전 단계의 .limitToLast(loadMoreLimit+2)에서 가져옵니다.

  • 이 개체 컬렉션의 첫 번째와 마지막 항목을 제거해야 합니다.첫 번째 항목은 이 목록을 얻기 위한 참조입니다.마지막 항목은 추가 표시 단추의 표시기입니다.

  • 저는 모든 것을 깨끗하게 유지할 많은 다른 논리를 가지고 있습니다.더 많은 기능을 로드하기 위해서만 이 코드를 추가해야 합니다.

      list = snapObjectAsArray;  // The list is an array from snapObject
      lastItemId = key; // get the first key of the list
    
      if (list.length < loadMoreLimit+1) {
        lastItemId = false; 
      }
      if (list.length > loadMoreLimit+1) {
        list.pop();
      }
      if (list.length > loadMoreLimit) {
        list.shift();
      }
      // Return the list.reverse() and lastItemId 
      // If lastItemId is an ID, it will be used for the next reference and a flag to show the "load more" button.
    }
    

저는 Firebase 통합을 쉽게 하기 위해 ReactFire를 사용하고 있습니다.

하는 데 이 됩니다.array해야 할 은 럼그, 사할용것입니다.reverse()함수(자세한 내용 읽기)

이를 달성하는 방법은 다음과 같습니다.

import React, { Component, PropTypes } from 'react';
import ReactMixin from 'react-mixin';
import ReactFireMixin from 'reactfire';

import Firebase from '../../../utils/firebaseUtils'; // Firebase.initializeApp(config);

@ReactMixin.decorate(ReactFireMixin)
export default class Add extends Component {
    constructor(args) {
        super(args);

        this.state = {
            articles: []
        };
    }

    componentWillMount() {
        let ref = Firebase.database().ref('articles').orderByChild('insertDate').limitToLast(10);
        this.bindAsArray(ref, 'articles'); // bind retrieved data to this.state.articles
    }

    render() {
        return (
            <div>
                {
                    this.state.articles.reverse().map(function(article) {
                        return <div>{article.title}</div>
                    })
                }
            </div>
        );
    }
}

더 좋은 방법이 있습니다.마이너스 서버 타임스탬프로 주문해야 합니다.오프라인에서도 마이너스 서버 타임스탬프를 얻는 방법은 무엇입니까?도움이 되는 숨겨진 분야가 있습니다.설명서의 관련 코드 조각:

var offsetRef = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com/.info/serverTimeOffset");
  offsetRef.on("value", function(snap) {
  var offset = snap.val();
  var estimatedServerTimeMs = new Date().getTime() + offset;
});

, Vavra 답변위해기하부타사용다임으로 합니다.sort_key

설정

const timestamp = new Date().getTime();
const data = {
  name: 'John Doe',
  city: 'New York',
  sort_key: timestamp * -1 // Gets the negative value of the timestamp
}

점점 ~하다

const ref = firebase.database().ref('business-images').child(id);
const query = ref.orderByChild('sort_key');
return $firebaseArray(query); // AngularFire function

이렇게 하면 최신 개체에서 가장 오래된 개체까지 모든 개체를 가져옵니다. »$indexOn그자리의 sortKey 빠르게 ▁to위해하▁make.

저도 이런 문제가 있었습니다. 저는 이 문제에 대한 아주 간단한 해결책을 찾았습니다. 어떤 식으로든 데이터를 조작하는 것은 포함되지 않습니다.DOM에 결과를 렌더링하는 경우, 어떤 종류의 목록에서.flexbox를 사용하고 컨테이너의 요소를 반대로 하는 클래스를 설정할 수 있습니다.

.reverse {
  display: flex;
  flex-direction: column-reverse;
}

myarray.syslog; 또는 this.myitems = items.map(항목 = > 항목).역(());

저는 이것을 겉치레로 했습니다.

query.orderByChild('sell').limitToLast(4).on("value", function(snapshot){
    snapshot.forEach(function (childSnapshot) {
        // PREPEND
    });
});

누군가가 이를 위한 두 가지 방법이 있다고 지적했습니다.

  1. 데이터 클라이언트 측 조작
  2. 데이터를 정렬하는 쿼리를 만듭니다.

내가 이것을 하는 가장 쉬운 방법은 옵션 1을 사용하는 것이지만, 그것을 통해.LinkedList각 객체를 스택 앞에 추가합니다.목록을 사용할 수 있을 정도로 유연합니다.ListView또는RecyclerView이렇게 하면 오래된 것부터 최신 것까지 순서대로 제공되지만 최신 것부터 오래된 것까지 계속 보거나 검색할 수 있습니다.

시간을 절약할 수 있는 orderColumn이라는 열을 추가할 수 있습니다.

Long refrenceTime = "large future time"; Long currentTime = "currentTime"; Long order = refrenceTime - currentTime;

이제 orderColumn이라는 이름의 열에 Long order를 저장하고 데이터를 orderBy(orderColumn)로 검색하면 필요한 것을 얻을 수 있습니다.

냥쓰기를 합니다.reverse()합니다.items[]그럼 a를 하라.this.items.reverse()

 ref.subscribe(snapshots => {
       this.loading.dismiss();

      this.items = [];
      snapshots.forEach(snapshot => {

        this.items.push(snapshot);

      });
      **this.items.reverse();**
    },

나에게 그것은limitToLast효과가 있었습니다.저는 또한 그것을 알았습니다.limitLast함수가 아닙니다.

const query = messagesRef.orderBy('createdAt', 'asc').limitToLast(25);

위의 내용이 저에게 효과가 있었습니다.

역순으로 인쇄

틀 밖에서 생각해 봅시다...정보가 사용자의 화면에 직접 인쇄되는 경우(합계 등 연속적인 순서로 수정해야 하는 내용이 없는 경우) 아래에서 위로 인쇄하기만 하면 됩니다.

하는 대신에, 인서공의, 쇄간끝새각컨따, 대신운로삽블는, 입을하록텐, 츠라의각에, ▁so▁(▁to대,▁each, 인하는삽신, ▁of따▁of입블을, ▁inserting,▁space▁new록▁instead▁print▁the▁content▁block▁the▁end,A += B),에 해당 A = B+A).

목록에 각 를 List Item( 항목할 수 .<li> 목록() <ol>).

이렇게 하면 데이터베이스의 공간을 절약하여 불필요한 데이터의 역방향을 방지할 수 있습니다.

언급URL : https://stackoverflow.com/questions/25611356/display-posts-in-descending-posted-order

반응형