단일 Firebase Firestore 문서를 업데이트하는 방법
인증 후 /users/에서 사용자 문서를 검색하려고 합니다. 그런 다음 auth 개체의 데이터와 사용자 지정 사용자 속성으로 문서를 업데이트하려고 합니다.그런데 업데이트 방법이 없다는 오류가 발생하고 있습니다.단일 문서를 업데이트할 수 있는 방법이 있습니까?모든 파이어스토어 문서 예제는 실제 문서를 가지고 있다고 가정하고 where 절을 사용하여 쿼리하는 예제는 없습니다.
firebase.firestore().collection("users").where("uid", "==", payload.uid)
.get()
.then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
console.log(doc.id, " => ", doc.data());
doc.update({foo: "bar"})
});
})
다음과 같이 정확하게 수행할 수 있습니다(https://firebase.google.com/docs/reference/js/v8/firebase.firestore.DocumentReference) :
// firebase v8
var db = firebase.firestore();
db.collection("users").doc(doc.id).update({foo: "bar"});
//firebase v9
const db = getFirestore();
async (e) => { //...
await updateDoc(doc(db, "users", doc.id), {
foo: 'bar'
});
//....
공식 문서도 확인하십시오.
파이어베이스 V9 업데이트 --
최신 버전의 Firebase에서는 다음과 같이 수행됩니다.
import { doc, updateDoc } from "firebase/firestore";
const washingtonRef = doc(db, "cities", "DC");
// Set the "capital" field of the city 'DC'
await updateDoc(washingtonRef, {
capital: true
});
사용자가 이미 있는지 확인한 후 간단히 확인.update
또는.set
그렇지 않은 경우:
var docRef = firebase.firestore().collection("users").doc(firebase.auth().currentUser.uid);
var o = {};
docRef.get().then(function(thisDoc) {
if (thisDoc.exists) {
//user is already there, write only last login
o.lastLoginDate = Date.now();
docRef.update(o);
}
else {
//new user
o.displayName = firebase.auth().currentUser.displayName;
o.accountCreatedDate = Date.now();
o.lastLoginDate = Date.now();
// Send it
docRef.set(o);
}
toast("Welcome " + firebase.auth().currentUser.displayName);
});
}).catch(function(error) {
toast(error.message);
});
당신의 원래 코드에서 이 라인을 변경합니다.
doc.update({foo: "bar"})
여기까지
doc.ref.update({foo: "bar"})
효과가 있어야 합니다.
그러나 더 나은 방법은 배치 쓰기를 사용하는 것입니다. https://firebase.google.com/docs/firestore/manage-data/transactions#batched-writes
이를 위한 올바른 방법은 다음과 같습니다. 스냅샷 개체에서 데이터를 조작하려면 .ref 속성을 참조해야 합니다.
firebase.firestore().collection("users").where("uid", "==", payload.uid)
.get()
.then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
console.log(doc.id, " => ", doc.data());
doc.ref.update({foo: "bar"})//not doc.update({foo: "bar"})
});
})
여기서 공식 문서 ID, 코드만 찾으면 됩니다!
enter code here
//Get user mail (logined)
val db = FirebaseFirestore.getInstance()
val user = Firebase.auth.currentUser
val mail = user?.email.toString()
//do update
val update = db.collection("spending").addSnapshotListener { snapshot, e ->
val doc = snapshot?.documents
doc?.forEach {
//Assign data that I got from document (I neet to declare dataclass)
val spendData= it.toObject(SpendDt::class.java)
if (spendData?.mail == mail) {
//Get document ID
val userId = it.id
//Select collection
val sfDocRef = db.collection("spendDocument").document(userId)
//Do transaction
db.runTransaction { transaction ->
val despesaConsum = hashMapOf(
"medalHalfYear" to true,
)
//SetOption.merege() is for an existing document
transaction.set(sfDocRef, despesaConsum, SetOptions.merge())
}
}
}
}
}
data class SpendDt(
var oilMoney: Map<String, Double> = mapOf(),
var mail: String = "",
var medalHalfYear: Boolean = false
)
언급URL : https://stackoverflow.com/questions/49682327/how-to-update-a-single-firebase-firestore-document
'programing' 카테고리의 다른 글
포함()을 여러 번 사용할 때 엔티티 프레임워크 코드가 느림 (0) | 2023.06.23 |
---|---|
여러 Gradle "spring-boot" 플러그인 "bootRun" 작업을 병렬로 시작합니다. (0) | 2023.06.23 |
openxlsx 오류: 행과 콜의 길이가 같아야 합니다. (0) | 2023.06.23 |
Node/Express 응용 프로그램에서 MySQL 연결이 누출되는 이유는 무엇입니까? (0) | 2023.06.18 |
Mongoose의 배열 스키마로 개체 밀어넣기 (0) | 2023.06.18 |