나의 목적 요약 :
한 콜렉션안에 documents 와 내가 가진 array 를 비교해서 없는 요소는 새로운 doc 을 생성하고 있는 요소는 doc.count 를 +1 해준다.
과정(문제점) :
firestore 에서 transaction 을 사용기로 마음먹고 다양하게 시도해봤지만 doc() 괄호안에 내가 가진 array 를 넣는게 가장 문제였다.
내가 시도해본 방법들중 하나 예시 1
내가가진array.forEach((el)=>{
return const docRef = db.collection('어쩌고').doc(el)
})
실패사유 : forEach 를 돌린다면 애초에 첫 요소가 return 되기 때문에 forEach 를 사용하지 말아야했다.
결론 => map 사용하니 가능 ...!!
내가 시도해본 방법들중 하나 예시 2
const docRef = db.collection('어쩌고')
or
const docRef = db.collection('어쩌고').where('어쩌고')
실패사유 : docRef 를 지정하는것까지는 가능하나 transaction을 사용할 때 path 를 못읽는다.
map과 forEach의 다른점에 대해서 알고있음에도 불구하고 습관적으로 forEach를 사용했고 생각의 전환을 하지못했다.
결과:
// 우선 내가 가진 array 를 map을 돌려서 path(ref) 만 있는 array 로 만들어준다.
const newArr = 내가 가진 array.map((el) => {
return db.collection('어쩌고').doc(el);
});
//이렇게하면 path 만 들어있는 array 가 생기고 그걸 transaction안에서 사용해준다.
db.runTransaction(async (transaction) => {
newArr.forEach(async (el) => {
const docOfOne = await transaction.get(el);
if (!docOfOne.exists) {
el.set('내가하고싶은대로'),
text: `${selectedArr[i]}`,
});
}
});
}).catch((error) => {
console.log(error);
});
})
성공적으로 firestore에 있는 doc 의 요소들과 비교가능 !