#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?