Как увеличить запись в Firebase?

У меня есть запись Firebase "search: 0" для каждого пользователя. В некоторых случаях я бы хотел добавить 1 к текущему счету. Я зашел так далеко, но по какой-то причине это не работает:

du.fbAddSearchCount = function() {
    var usr = new Firebase(firebase_url + "/users/" + user_uid);

    usr.on("value", function(snapshot) {
        user = snapshot.val();

       var usersRef = ref.child("users");

       var fbUser = usersRef.child(user_uid);
       fbUser.update( {
           searches: user.searches + 1
       });
    }
}

Любая помощь, чтобы заставить это работать?

Спасибо.


person user1661677    schedule 15.07.2015    source источник
comment
что такое user.searches?   -  person Chrillewoodz    schedule 15.07.2015
comment
Это будет то значение, которое в настоящее время находится в записи поисковых запросов пользователя в базе огня. Например, если это 5, я бы хотел, чтобы этот скрипт обновил это до 6.   -  person user1661677    schedule 15.07.2015
comment
Так что не работает? Должен дать более подробную информацию. Обновляет ли он вообще запись, но не новым номером?   -  person Chrillewoodz    schedule 15.07.2015
comment
Кажется актуальным: stackoverflow.com/questions/31361993/   -  person Frank van Puffelen    schedule 15.07.2015
comment
Какое событие должно вызвать увеличение количества поисков?   -  person awei    schedule 22.07.2016


Ответы (5)


В firebase JavaScript SDK v7.14.0 появился новый метод ServerValue.increment()

Это лучше с точки зрения производительности и дешевле, поскольку не требуется поездки туда и обратно.

См. здесь

Добавлен ServerValue.increment () для поддержки увеличения значения атомарного поля без транзакций.

Документы API здесь

Пример использования:

firebase.database()
    .ref('users')
    .child(user_uid)
    .child('searches')
    .set(firebase.database.ServerValue.increment(1))

Или вы можете уменьшить, просто поместив -1 в качестве аргумента функции, например:

firebase.database()
    .ref('users')
    .child(user_uid)
    .child('searches')
    .set(firebase.database.ServerValue.increment(-1))
person Oleg Dater    schedule 14.05.2020
comment
Отличное обновление Олег. Теперь действительно существует операция increment для базы данных реального времени, которая работает значительно лучше, чем использование транзакции (см. Мой тест здесь). - person Frank van Puffelen; 25.05.2020

Вы можете использовать транзакцию

var databaseRef = firebase.database().ref('users').child(user_uid).child('searches');

databaseRef.transaction(function(searches) {
  if (searches) {
    searches = searches + 1;
  }
  return searches;
});
person Sunday G Akinsete    schedule 08.08.2016
comment
Ваш код не будет работать, когда searches = 0. Вместо этого вы можете сделать это: return (searches || 0) + 1; - person david-ojeda; 01.02.2017

Для базы данных реального времени использование transaction кажется лучшим способом сделать это. См. ответ от Sunday G Akinsete

Из его ответа и связанных с ним комментариев:

firebase
    .database()
    .ref('users')
    .child(user_uid)
    .child('searches')
    .transaction(function(searches) {
        return (searches || 0) + 1
    })

Для базы данных Firestore вы можете использовать Firebase Sentinel values ​​ для увеличения / уменьшения значения, которое без необходимости извлекать его

Инкремент

firebase
    .firestore()
    .collection('users')
    .doc('some-user')
    .update({ 
         valueToIncrement: firebase.firestore.FieldValue.increment(1) 
    })

Декремент

firebase
    .firestore()
    .collection('users')
    .doc('some-user')
    .update({ 
        valueToDecrement: firebase.firestore.FieldValue.increment(-1) 
    })

Справочник по документации

person Mathias Gilson    schedule 06.12.2019
comment
Хорошо, но исходный вопрос, похоже, использует базу данных в реальном времени вместо Firestore. - person ntcho; 03.01.2020
comment
Ах да, я не заметил, я обновил ответ, чтобы указать, что это только для Firestore. Спасибо ! - person Mathias Gilson; 04.01.2020

ref.transection(function(queue_length) {
    if(queue_length|| (queue_length === 0))
    {
        queue_length++; 
    }
    return queue_length;

})

Вы можете использовать это так;)

person Sachin Kalonia    schedule 17.09.2017
comment
объясните свой ответ - person Anantha Raju C; 17.09.2017
comment
Какая среда СОБИРАЕТ javascript? - person Ivan Rubinson; 01.04.2019

database.ref("users").child("user_uid").transaction((user) => {
    if (user) {
        user.searches = actives.searches + 1;
    }
    return user;
});

Это работает на вас. Я сделал это '.child (' search ')', но он не работает. (Ничего не изменилось).

person Minwoo Yu    schedule 17.01.2020