flutter, firebase로 웹앱을 개발하고 있다.
개발하다 보면 데이터 구조가 바뀌는 일이 있다.
쌓인 데이터가 다 테스트 데이터면 모두 날리고 새로 시작하면 되지만, 이미 쌓여있는 실제 데이터가 있다면 기존 데이터를 새 구조에 맞게 마이그레이션해줘야 한다.
데이터 마이그레이션을 할 때는 나는 node.js를 이용하는데 (firestore에 바로 접근 가능하고 빠름!)
세팅이 되어 있으면 그냥 하면 되는데
노트북이 (또) 포맷된 뒤로 잘 세팅해둔 node.js 백업을 놓쳤다는 걸 뒤늦게 깨달았다..
검색과 ai의 힘을 빌려 세팅을 완료했다.
brew install node
node -v
원하는 위치에 폴더를 만들고 (ex: 프로젝트명_data)
npm init -y
-> package.json 파일 자동 생성
npm install firebase-admin
: 파이어베이스 프로젝트 관리자 권한을 가진 서비스 계정 키 파일임
마이그레이션을 수행할 js 파일을 추가함 (ex: mig_data.js)
firebase의 Admin SDK 설명 문서 참고
var admin = require("firebase-admin");
// Fetch the service account key JSON file contents
var serviceAccount = require("path/to/serviceAccountKey.json");
// Initialize the app with a service account, granting admin privileges
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
// The database URL depends on the location of the database
databaseURL: "https://DATABASE_NAME.firebaseio.com"
});
// As an admin, the app has access to read and write all data, regardless of Security Rules
const firestore = admin.firestore();
찾으려는 문서의 경로는 firestore. 뒤에 컬렉션 단위부터 시작하면 된다.
변수로 저장해두면 접근하기 편하다.
var ref = firestore
.collection("YOUR_COLLECTION_NAME")
.doc("YOU_DOCUMENT_NAME")
.collection("YOUR_SUB_COLLECTION_NAME);
잘 동작하는지 테스트하기 위해 원하는 조건을 걸어서 문서를 불러온 뒤 console.log 해본다.
// title이 '240725'이고 reg_uid가 '12345'인 문서 찾기
ref.where("title", "==", "240725").where("reg_uid", "==", "12345").get().then((snapshot) => {
snapshot.forEach((doc) => {
// enable이 true일 경우에만, content 필드의 값을 출력하도록 함
if (doc.data().enable == true) {
console.log(doc.id, "=>", doc.data().content);
}
});
}).catch((err) => {
console.log("Error getting documents", err);
}
);
터미널을 열고,
node 파일명.js
제대로 실행된다면 일치하는 데이터의 content 필드 값을 출력해줄 것이다!