2014-11-27 24 views
7

Có cách nào để có được kỷ lục ngẫu nhiên từ căn cứ hỏa lực như thế này:Đón kỷ lục ngẫu nhiên từ căn cứ hỏa lực với AngularFire

{ 
    "-JbmopNnshefBT2nS2S7" : { 
    "dislike" : 0, 
    "like" : 0, 
    "post" : "First post." 
    }, 
    "-JbmoudijnJjDBSXNQ8_" : { 
    "dislike" : 0, 
    "like" : 0, 
    "post" : "Second post." 
    } 
} 

tôi đã sử dụng mã này để giải quyết vấn đề, nhưng nó tải về tất cả hồ sơ, vì vậy nếu DB sẽ lớn hơn, ứng dụng của tôi sẽ làm việc rất chậm:

HTML code: mã

<div ng-controller="RandomCtrl">{{RandomPost.post}}</div> 

JS:

+0

bạn có thể sử dụng tăng như một chìa khóa và sau đó chỉ cần chọn ngẫu nhiên một. – webduvet

Trả lời

0

Bạn có thể làm việc với một đối tượng có chứa tất cả các phím để giải quyết vấn đề với DB lớn, liên quan đến việc chọn một khóa ngẫu nhiên, tôi nghĩ rằng bạn là tốt như cách bạn đang làm. Một cách khác để tôi đoán là sử dụng các phím gia tăng như @ lombausch đã nói, sau đó bạn có thể sử dụng kết hợp phương thức key() để lấy khóa cuối cùng được thêm vào và sau đó nhận ngẫu nhiên dựa trên các giá trị tối thiểu, tối đa.

Đây là anti-pattern để lưu incremental/phím số: https://www.firebase.com/docs/web/guide/saving-data.html#section-push

chìa khóa() phương pháp tham khảo: https://www.firebase.com/docs/web/api/firebase/key.html

+0

Cảm ơn bạn và @lombausch cho câu trả lời! Nhưng tôi không thể hiểu, làm thế nào tôi có thể lưu trữ dữ liệu bằng cách sử dụng các phím gia tăng, bởi vì Firebase làm cho các phím duy nhất để thay thế. Ví dụ: tôi muốn thêm dữ liệu như sau: {"name": "Alex", thành phố: "LA"} và {"name": "Sam", "city": "Berlin"}. Sau khi gửi tôi muốn lấy DB như thế này: {1: {"name": "Alex", thành phố: "LA"}, 2: {"name": "Sam", "city": "Berlin"}}. Có cách nào để làm điều đó? – user3258741

+0

Bạn đã kiểm tra liên kết đầu tiên của tôi bằng cách sử dụng set() bạn có thể chỉ định khóa bạn muốn (giá trị gia tăng) nhưng như đã đề cập trong tài liệu bạn có thể hoặc không gặp phải một số vấn đề với các tác phẩm đồng thời/đồng thời. –

2

Bạn có thể sử dụng startAt với chỉ số gia tăng của riêng bạn. Ví dụ: giả sử bạn có chỉ mục (0 đến n) trong hồ sơ của mình.

Thực hiện truy vấn này: orderByChild ("chỉ mục"). StartAt (rint) .limitToFirst (1);

Xem snippit mã:

var rint = Math.floor((Math.random() * 10)) // you have 10 records 
var query = ref.orderByChild("index").startAt(rint).limitToFirst(1); 

var results = $firebaseArray(query); 
results.$loaded(
    function(x) { 
    // let's get one 
    $scope.oneResult = x[0]; 
    }, function(error) { 
    console.error("Error:", error); 
    }); 
}; 
Các vấn đề liên quan