programing

Firebase에서 모든 노드 데이터를 로드하지 않고 노드의 자식 수를 가져올 수 있는 방법이 있습니까?

css3 2023. 7. 4. 22:06

Firebase에서 모든 노드 데이터를 로드하지 않고 노드의 자식 수를 가져올 수 있는 방법이 있습니까?

다음을 통해 자녀 수를 확인할 수 있습니다.

firebase_node.once('value', function(snapshot) { alert('Count: ' + snapshot.numChildren()); });

하지만 이렇게 하면 해당 노드의 전체 하위 트리가 서버에서 가져온다고 생각합니다.대용량 목록의 경우 RAM 및 지연 시간이 많이 소요되는 것으로 보입니다.전체를 가져오지 않고 카운트(및/또는 자식 이름 목록)를 가져올 수 있는 방법이 있습니까?

제공한 코드 조각은 실제로 전체 데이터 집합을 로드한 다음 클라이언트 측에서 계산합니다. 이는 대량의 데이터에 대해 매우 느릴 수 있습니다.

파이어베이스는 현재 데이터를 로드하지 않고 어린이 수를 셀 수 있는 방법이 없지만, 추가할 계획입니다.

현재로서는 하위 항목 수에 대한 카운터를 유지하고 새 하위 항목을 추가할 때마다 업데이트하는 것이 한 가지 해결책입니다.트랜잭션을 사용하여 다음 코드 추적 업보와 같은 항목을 계산할 수 있습니다.

var upvotesRef = new Firebase('https://docs-examples.firebaseio.com/android/saving-data/fireblog/posts/-JRHTHaIs-jNPLXOQivY/upvotes');
upvotesRef.transaction(function (current_value) {
  return (current_value || 0) + 1;
});

자세한 내용은 https://www.firebase.com/docs/transactions.html 를 참조하십시오.

업데이트: Firebase에서 최근에 출시한 클라우드 기능.클라우드 기능을 사용하면 서버를 직접 만들 필요가 없습니다.JavaScript 기능을 작성하여 Firebase에 업로드하면 됩니다.파이어베이스는 이벤트가 발생할 때마다 기능을 트리거하는 역할을 담당합니다.

예를 들어, 업보를 카운트하려면 다음과 유사한 구조를 만들어야 합니다.

{
  "posts" : {
    "-JRHTHaIs-jNPLXOQivY" : {
      "upvotes_count":5,
      "upvotes" : {
      "userX" : true,
      "userY" : true,
      "userZ" : true,
      ...
    }
    }
  }
}

그런 다음 자바스크립트 함수를 작성하여 다음을 증가시킵니다.upvotes_count새로운 편지가 있을 때.upvotesvmdk

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.countlikes = functions.database.ref('/posts/$postid/upvotes').onWrite(event => {
  return event.data.ref.parent.child('upvotes_count').set(event.data.numChildren());
});

설명서를 읽고 클라우드 기능을 시작하는 방법을 알 수 있습니다.

또한, 게시물을 세는 또 다른 예는 다음과 같습니다: https://github.com/firebase/functions-samples/blob/master/child-count/functions/index.js

2018년 1월 업데이트

소방본부 문서가 바뀌어서 대신에event우리는 지금 가지고 있습니다.change그리고.context.

는 ""고 불평하는 오류를 던집니다.event.data정의되지 않았습니다.이 더잘 하는 것 요: 패 턴 더 작 같 것 니 습 다 이 는 하 동 잘 이 다 ▁this 니 같 ▁seems 습 이 것 ▁pattern

exports.countPrescriptions = functions.database.ref(`/prescriptions`).onWrite((change, context) => {
    const data = change.after.val();
    const count = Object.keys(data).length;
    return change.after.ref.child('_count').set(count);
});

```

여러 명의 다른 사람들이 이미 친절하게 답변했기 때문에 게임에서 조금 늦었지만, 어떻게 구현할 수 있는지 공유하겠습니다.

이것은 Firebase REST API가 다음을 제공한다는 사실에 달려 있습니다.shallow=true매개 변수

에게 있고가니다합이 있다고 .post의 개체는 여러 를 가질 수 .comments:

{
 "posts": {
  "$postKey": {
   "comments": {
     ...  
   }
  }
 }
}

여러분은 분명히 모든 댓글을 가져오는 것이 아니라 댓글의 수만 가져오는 것을 원하지 않을 것입니다.

당신이 게시물의 키를 가지고 있다고 가정하면, 당신은 다음과 같이 보낼 수 있습니다.GET요▁to.https://yourapp.firebaseio.com/posts/[the post key]/comments?shallow=true.

쌍의 합니다. 각은 "-" - " "입니다. 여기서 각 키는 주석의 키이고 값은true:

{
 "comment1key": true,
 "comment2key": true,
 ...,
 "comment9999key": true
}

데이터를 , 키 수 commentCount = 이의는크기동예등한를, 제이응답찾수값있을의을습니다으며키작수여계하산를씬훨청이보하터다는요것데응답count예▁comment▁in▁the = comment).Object.keys(result).length).

반환되는 키 수를 계산하는 중이므로 이 방법으로 문제가 완전히 해결되지 않을 수 있으며 값이 변경될 때 값을 구독할 수는 없지만 스키마를 변경할 필요 없이 반환되는 데이터의 크기를 크게 줄일 수 있습니다.

진행 중인 카운트를 저장하고 유효성 검사를 사용하여 카운트를 적용합니다.나는 이것을 함께 해킹했습니다 - 독특한 투표와 계속해서 올라오는 개표를 유지하기 위해!하지만 이번에는 제 제안을 테스트했습니다! (컷/붙여넣기 오류에도 불구하고!)

여기서 '꼼수'는 노드 우선순위를 투표수로 사용하는 것입니다.

데이터는 다음과 같습니다.

투표/달러 발행BeingVotOn/user/$uniqueIdOfVoter = 이 투표 수, 우선 순위 = 이 투표 수/$ 문제BeingVoteOn/Count = 'user/'+$idOfLastVote, 우선 순위 = Count ofLastVote

,"vote": {
  ".read" : true
  ,".write" : true
  ,"$issue" : {
    "user" : {
      "$user" : {
        ".validate" : "!data.exists() && 
             newData.val()==data.parent().parent().child('count').getPriority()+1 &&
             newData.val()==newData.GetPriority()" 

사용자는 한 번만 투표할 수 있으며 & count는 현재 count보다 하나 더 커야 하며 & data 값은 우선순위와 같아야 합니다.

      }
    }
    ,"count" : {
      ".validate" : "data.parent().child(newData.val()).val()==newData.getPriority() &&
             newData.getPriority()==data.getPriority()+1 "
    }

카운트(마지막 유권자 진짜) - 투표는 존재해야 하며 카운트는 새 카운트와 동일해야 하며 & & 새 카운트(우선 순위)는 하나만 올라갈 수 있습니다.

  }
}

테스트 스크립트를 사용하여 다른 사용자의 10표를 추가합니다(예: 프로덕션에서 사용자 auth.uid인 경우 id는 가짜입니다).유효성 검사 실패를 확인하려면 (i--) 10까지 카운트다운합니다.

<script src='https://cdn.firebase.com/v0/firebase.js'></script>
<script>
  window.fb = new Firebase('https:...vote/iss1/');
  window.fb.child('count').once('value', function (dss) {
    votes = dss.getPriority();
    for (var i=1;i<10;i++) vote(dss,i+votes);
  } );

function vote(dss,count)
{
  var user='user/zz' + count; // replace with auth.id or whatever
  window.fb.child(user).setWithPriority(count,count);
  window.fb.child('count').setWithPriority(user,count);
}
</script>

여기서 '위험'은 투표가 이루어지지만 카운트가 업데이트되지 않는 것입니다(해킹 또는 스크립트 실패).이것이 투표가 고유한 '우선 순위'를 갖는 이유입니다. 스크립트는 현재 카운트보다 높은 우선 순위를 가진 투표가 없도록 확실히 시작해야 합니다. 만약 자체적으로 처리하기 전에 해당 거래를 완료해야 한다면, 고객이 당신을 대신하여 청소하도록 하십시오. :)

시작하기 전에 카운트를 우선 순위로 초기화해야 합니다. 위조를 사용하면 이 작업을 수행할 수 없으므로 유효성 검사가 활성화되기 전에 stub 스크립트가 필요합니다.

클라우드 함수를 작성하고 노드 수를 업데이트합니다.

// below function to get the given node count.
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.userscount = functions.database.ref('/users/')
    .onWrite(event => {

      console.log('users number : ', event.data.numChildren());


      return event.data.ref.parent.child('count/users').set(event.data.numChildren());
    }); 

참조: https://firebase.google.com/docs/functions/database-events

root--| |-users(이 노드에는 모든 사용자 목록이 포함됨) |
|-count |-userscount : (이 노드는 클라우드 함수에 의해 사용자 수와 함께 동적으로 추가됨)

언급URL : https://stackoverflow.com/questions/15148803/in-firebase-is-there-a-way-to-get-the-number-of-children-of-a-node-without-load