Firestore — запрос, затем обновление

#javascript #firebase #google-cloud-firestore

#javascript #firebase #google-облако-firestore

Вопрос:

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

Я попытался следовать этому руководству: https://www.youtube.com/watch?v=mYyPbfpoZeM И ознакомьтесь с документацией. Оба не помогли. Другие темы той же темы, ну, разные.

У меня есть база данных объектов, которые имеют уникальный идентификатор, хранящийся как целое число. У меня есть HTML-форма для получения идентификатора в качестве пользовательского ввода и запрос ниже для извлечения соответствующего объекта.

Я попробовал это. Запрос сработал, обновление — нет.

 db.collection('objects').where('ID','==', ID ).get().then((snapshot) => {
        snapshot.docs.forEach( doc => {
            console.log('debug');
            console.log(doc.data().ID);
        })
    });
  

Я все еще новичок в firebase и js, поэтому, пожалуйста, простите меня, если мой код абсолютно неверен.
В настоящее время я застрял с этим:

 db.collection('objects').where('ID','==', ID ).get().then((doc) => {
    console.table(doc);
});
  

Который все еще не работает.

Для второго фрагмента я в настоящее время получаю нечитаемую таблицу, в которой я не могу найти объект, который искал.

Как мне обновить одно значение в одном документе?

РЕДАКТИРОВАТЬ: я забыл свои попытки реализации функции обновления. Я попробовал doc.update({value:0}) внутри цикла for в фрагменте, который дал doc.update is not a function результат. Аналогично для doc.data().update(...) .

Во втором фрагменте я в основном пытался увидеть, что я получил, и запустил варианты вышеупомянутой функции uodate . Безуспешно.

Комментарии:

1. где ваш код обновления?

2. @NadhirFalta отредактировано, спасибо, что указали, что я пропустил главное

3. используете ли вы AngularFirestore AngularFirestore ? И знаете ли вы, что нужно что-то делать внутри этого цикла, кроме обновления значения?

4. AngularFirebase, насколько я знаю, нет. Я не знаю, что это будет означать. Знаю ли я, что нужно что-то делать внутри цикла? Я не хочу делать что-либо еще в цикле. Пока только консольное ведение журнала для отладки.

5. Могу ли я увидеть ваш конструктор?

Ответ №1:

Мне удалось заставить его работать, изучив ту часть документации firestore, в которой более подробно рассказывается о реальных функциях. Почему-то мне было трудно найти это.

 db.collection("users").where("name", "==", somename).limit(1).get().then(query => {
                console.log(query);
                const thing = query.docs[0];
                console.log(thing.data());
                let tmp = thing.data();
                tmp.current_game_play = tmp.current_game_play   1;
                console.log(tmp);
                thing.ref.update(tmp);
            });
  

Итак, я использую where для получения объекта запроса, использую get для получения querySnapshot внутри решения then promise, использую docs[0] для извлечения первого (и единственного) documentSnapshot и, наконец ref , для получения ссылки, которая делает все это обновляемым позже.

Комментарии:

1.ссылка на документы, в которых говорится о ref querysnapshotdocument googleapis.dev/nodejs/firestore/latest/ …

Ответ №2:

попробуйте это:

 var objectRef= db.collection("objects").doc(ID);

objectRef.update({
    value: 0
}).then(function() {
    console.log("Document successfully updated!");
}).catch(function(error) {
    // The document probably doesn't exist.
    console.error("Error updating document: ", error);
});
  

Комментарии:

1. Либо я делаю const ID = parseInt(userInput); и получаю argument must be of type string but is int , либо я делаю это без parseInt, и он не возвращает никаких объектов

2. Кроме того, мне нужно, чтобы новое value было основано на старом значении, как мне это сделать? Могу ли я просто сказать .update({value: value-othervalue}) ?

3. @Harri думаю, проблема в вашем пользовательском вводе, чего вы ожидаете от пользователя? и как выглядят ваши идентификаторы firestoreI?

4. пользовательский ввод изначально представляет собой строку. Я могу легко преобразовать его в int. Внутри firestore идентификаторы являются целыми числами. В качестве альтернативы, есть ли простой способ получить идентификаторы, сгенерированные firestore?