2013-09-24 4 views
5

Я использую Еогеасп firebase, чтобы получить каждый ребенок в дереве из этого URLВыберите случайное значение из firebase снимка

Цели, при загрузке страницы захватить случайный элемент из firebase и показать его

структуру данных

grabbit (table name) 

     active (for active items for sale) 

      category (the category of the item ie womensClothes, MensShoes etc) 

       unique id of the item 

на странице загрузки перейдите в http://gamerholic.firebase.com/grabbit/active и захватить любую одну из категорий и вернуть его ..

Script

var grabbitRef = new Firebase('https://gamerholic.firebaseIO.com/grabbit/active/'); 
grabbitRef.on('value', function(snapshot) { 
if(snapshot.val() === null) { 
alert("invalid"); 
} else { 
    // get snap shot data: 
snapshot.forEach(function(snapshot) { 

var name = snapshot.name(); 
alert(name); 
}); 

} 
}); 

После того как я есть случайная категория сказать, «Электроника», я получаю новый снимок и он вернуть любой случайный элемент, который находится в электронике

var grabbitRef = new Firebase('https://gamerholic.firebaseIO.com/grabbit/active/'+name); 
grabbitRef.on('value', function(snapshot) { 
if(snapshot.val() === null) { 
alert("invalid"); 
} else { 
    // get snap shot data: 
snapshot.forEach(function(snapshot) { 

var id = snapshot.name(); 
alert(id); 
}); 

} 
}); 

с идентификатором теперь я могу получить Детали предмета

var grabbitRef = new Firebase('https://gamerholic.firebaseIO.com/grabbit/active/'+name+'/'+id); 
+0

Избегайте вложения данных в Firebase: https://firebase.google.com/docs/database/web/structure-data#avoid_nesting_data –

ответ

8

К сожалению, в списке Firebase невозможно взять случайный элемент из списка. Вы можете сделать ограничение (1), чтобы захватить первый элемент, или endAt(). Limit (1), чтобы захватить последний элемент.

Если вы используете forEach, вы также можете захватить все предметы, как и вы, а затем выбрать их наугад, используя Math.random. Например:

var i = 0; 
var rand = Math.floor(Math.random() * snapshot.numChildren()); 
snapshot.forEach(function(snapshot) { 
    if (i == rand) { 
    // picked random item, snapshot.val(). 
    } 
    i++; 
}); 
+18

все еще не возможно через 3 года? – zizoujab

+1

Я тоже хотел бы использовать его – Tino

+0

Его 2017 год, и это все еще хорошее решение, хотя Google выпустил новую услугу «Функции», но предназначен для мобильных приложений –

0

Одним из способов реализации этого является хранение дополнительный ребенок атрибут с каждым элементом вашего списка, который будет принимать на случайное значение. Назовем имя этого атрибута «randomVal».

Чтобы выбрать вашу случайную запись, вы должны использовать orderByChild ("randomVal"), а затем ограничить запрос возвратом только одной записи. Сразу после получения этой записи вы должны написать новое случайное значение в элемент «randomVal».

Помимо дополнительной бухгалтерской работы, самым большим недостатком этого подхода является то, что для записи случайного элемента требуется запись в базу данных каждый раз. Я новичок в firebase, поэтому я не знаю, насколько значителен этот недостаток.

Кроме того, убедитесь, что вы указали эту часть базы данных на «randomVal», чтобы улучшить производительность запроса.

Смежные вопросы