android - 파이썬 - 파이어 베이스 cloud firestore




Firebase 데이터베이스를 Cloud Firestore로 변환 (2)

나는 새로운 것을 배울 때 나 자신에게 지침을 쓴다. Realtime Database를 Cloud Firestore로 마이그레이션 한 방법을 설명하는 안내서입니다. 첫 번째 섹션을 건너 뛸 수 있습니다. Markdown에서 작성한 코드 마크 업 중 일부는 StackOverflow의 마크 업으로 변환되지 않습니다. 읽는 데 어려움이 있으시면 원래 Markdown 버전으로 이메일을 보내 드리겠습니다. 이제 컨트롤러를 Cloud Firestore 쿼리로 업데이트하려고합니다.

Firebase Realtime Database에서 Cloud Firestore 로의 마이그레이션

왜 Firebase Realtime Database가 필요합니까?

2 년 넘게 내 스택은 Angular와 Firebase였습니다. 데이터 바인딩이 눈에 띄었습니다. 사용자가보기에서 데이터를 변경하면 컨트롤러와 클라우드 데이터베이스에서 데이터가 즉시 변경됩니다. 또는 다른 모든 순서의 이벤트. 첫 번째 Firebase 프로젝트는 두 명의 플레이어가 원격으로 게임을 할 수있는 틱택테크 게임이었습니다. 화면에서 순간적으로 내 클릭이 나타나고 그 반대의 경우 클라우드 데이터베이스가 업데이트됩니다. (Firebase는 이것을 "실시간으로 클라이언트간에 동기화 된 상태"라고 부릅니다.)

Firebase의 Auth 라이브러리도 마음에 듭니다. OAuth2 사용자 로그인 설정 Facebook, Google, Twitter, GitHub 또는 전화 번호 또는 구식 이메일 및 비밀번호는 쉽습니다.

나는 서버를 설치하고 유지 관리하는 일을 처리 할 필요가 없다.

그리고 NoSQL 데이터베이스를 사용하는 것을 좋아합니다. JavaScript에서 객체 배열을 사용하므로 데이터베이스에서 동일한 데이터 구조를 사용하지 않는 이유는 무엇입니까?

필자는 이것을 필요로하지 않지만 모바일 앱 개발자는 Firebase Realtime Database의 오프라인 기능을 사용할 수 있습니다. 사용자가 서비스 범위를 벗어나면 데이터베이스는 계속 업데이트되므로 사용자가 다시 온라인 상태가되면 현재 데이터에 액세스 할 수 있습니다.

Plus Firebase는 사진, 오디오 및 비디오와 같은 대형 바이너리 파일을 저장합니다.

Firebase Realtime Database가 좋지 않은 점은 무엇입니까? 쿼리. 내 개는 너무 많은 이웃 여자 친구가있어서 나는 그들 모두를 추적하기 위해 데이터베이스가 필요합니다. 나는 중국의 주인에게 연극을 위해 그녀를 초대하라고 부탁하고 싶다. 전화 번호를 얻는 것은 쉽지 않습니다. 파이어베이스에게 배열 dogs 를보고, nameChina 인 객체를 찾고, phone_number 필드를 반환 phone_number 말할 수는 없습니다. 파이어베이스에 전체 배열을 다운로드하도록 지시 한 다음 forEach 루프를 실행하여 각 객체를 반복하여 name === China 찾습니다. 이것은 배열, 모든 하위 배열 및 모든 중첩 된 하위 수준의 모든 객체를 반환하기 때문에 "심층 쿼리"라고합니다. 내 강아지는 너무 많은 여자 친구가 있기 때문에 초를 모두 다운로드 할 수 있습니다!

Firebase Realtime Database는 정렬되어 있으므로 이름, 나이 등으로 정렬 된 이웃 개 배열을 다운로드 할 수 있습니다. 예를 들어 5 년이 넘은 개만 필터링 할 수 있지만 Firebase Realtime Database는 정렬 필터링 할 수 없습니다.

Firebase Realtime Database에서 특정 객체를 찾는 핵심은 키를 알아내는 것입니다. 키는 -KloeQHDC-mugPjJMAG4 와 같이 가벼운 오브젝트입니다. 개체의 키를 추적하면 데이터베이스에서 개체를 쉽게 검색 할 수 있습니다. 예를 들어, 새로운 사용자가 Facebook으로 로그인하여 Auth 데이터베이스에 레코드를 만든 다음 실시간 데이터베이스에 사용자 계정을 만들면 사용자의 인증 키를 사용자 계정의 키 - 값 쌍으로 만들 수 있습니다. 이 사용자와 관련된 인증 데이터 ( displayName , photoURL 등)를 쉽게 찾을 수 있습니다.

Auth에 대한 하나의 데이터베이스와 이진 파일 저장소에 대한 또 다른 데이터베이스 및 기타 모든 것에 대한 세 번째 데이터베이스를 사용하면 추적 할 수있는 많은 키가 있습니다.

대규모 데이터 프로젝트의 경우 Firebase Realtime Database에는 추가 제한 사항이 있습니다. 데이터는 32 개 계층 만 중첩 할 수 있습니다. 스케일 업하려면 샤딩이 필요합니다. 클라이언트가 큰 데이터를 수행하거나 자신의 5000 레코드가 큰 데이터라고 생각하면 서버에서 SQL을 사용하지 않도록 클라이언트를 설득하는 방법을 사용해야합니다.

왜 클라우드 파이어 스토어인가?

왜? 쿼리! Cloud Firestore를 사용하면 이제는 dogs 배열을 쿼리하여 China 과 동일한 name 의 레코드를 요청할 수 있습니다. Firebase는 내가 원하는 객체 만 반환합니다.

Cloud Firestore는 데이터를 정렬 하고 필터링 할 수 있습니다.

Cloud Firestore는 문서 내의 하위 수집을 처리 할 수 ​​있습니다. 당신은 문서의 subcollections을 포함하는 문서를 요청할 수 있으며, 그것의 subcollections없이 문서를 얻을 수 있습니다. 즉, 얕은 쿼리. 문서의 서브 콜렉션이 포함 된 문서를 삭제하고 서브 콜렉션을 유지할 수도 있습니다.

Cloud Firestore는 Firebase Realtime Database보다 확장 성이 좋습니다. 보안 성이 뛰어나고 다른 새로운 기능과 개선 사항이 있습니다.

종속성 삽입

먼저 Cloud Firestore를 프로젝트에 추가해야합니다. Firebase CDN에 링크 한 후 index.html 파일에서 Cloud Firestore CDN에 링크하십시오 :

<script src="https://www.gstatic.com/firebasejs/4.5.0/firebase.js"></script>
<script src="https://www.gstatic.com/firebasejs/4.5.0/firebase-firestore.js"></script>

또는 노드 모듈을 다운로드하여 링크하십시오 :

npm install [email protected].5.0 --save

노드 서버에서 Firebase SDK를 사용하는 경우 종속성도 추가해야합니다.

const firebase = require("firebase");
// Required for side-effects
require("firebase/firestore");

또한 index.html 에서 앱을 초기화해야합니다.

firebase.initializeApp({
  apiKey: '### FIREBASE API KEY ###',
  authDomain: '### FIREBASE AUTH DOMAIN ###',
  projectId: '### CLOUD FIRESTORE PROJECT ID ###'
});

Firebase Realtime Database, Storage 및 Cloud Messaging을 사용하고 있다면 더 많은 것들이 있습니다 :

firebase.initializeApp({
  apiKey: '### FIREBASE API KEY ###',
  authDomain: '### FIREBASE AUTH DOMAIN ###',
  databaseURL: "https://###.firebaseio.com",
  messagingSenderId: "###",
  projectId: '### CLOUD FIRESTORE PROJECT ID ###',
  storageBucket: "###.appspot.com"
});

마지막으로 컨트롤러에서 Cloud Firestore를 참조하십시오.

var db = firebase.firestore();

데이터 마이그레이션

다음으로, Firebase Realtime Database에서 Cloud Firestore로 데이터를 마이그레이션하고자 할 것입니다. 이것은 쉽다.

return firebase.database().ref('dogs').once('value') // get a snapshot of the user's data
.then(function(snapshot) { // then execute a promise on the snapshot
  snapshot.forEach(function(childSnapshot) { // iterate through the user's data
    let childData = childSnapshot.val(); // this is the user's data
    db.collection('dogs').doc(childData.dog).set(childData); // each dog is written to Cloud Firestore
  })
});

이것을하지 마십시오 :

return firebase.database().ref('dogs').once('value') // get a snapshot of the user's data
.then(function(snapshot) { // then execute a promise on the snapshot
    db.collection('dogs').set(snapshot); // copy the array to Cloud Firestore
});

후자는 Firebase Realtime Database 키를 복사합니다. 또한 Cloud Firestore에 컬렉션을 업로드 할 수 없기 때문에 작동하지 않으며 문서 만 업로드 할 수 있습니다.

forEach 예에서 forEach 루프는 각 레코드를 반복하고 문서로 Cloud Firestore에 업로드합니다. 컬렉션은 자동으로 생성되고 이름이 지정된 dogs 됩니다. 또한 Firebase Realtime Database 키를 제거하고 Cloud Firestore 키로 대체합니다.

return 은이 명령 다음에 실행되는 모든 코드를 중지합니다. 많은 배열을 이전하려면 마지막 명령에서만 return 을 사용하십시오.

firebase.database().ref('dogs').once('value') // get a snapshot of the user's data
.then(function(snapshot) { // then execute a promise on the snapshot
  snapshot.forEach(function(childSnapshot) { // iterate through the user's data
    let childData = childSnapshot.val(); // this is the user's data
    db.collection('dogs').doc(childData.dog).set(childData); // each dog is written to Cloud Firestore
  })
});

firebase.database().ref('cats').once('value') // get a snapshot of the user's data
.then(function(snapshot) { // then execute a promise on the snapshot
  snapshot.forEach(function(childSnapshot) { // iterate through the user's data
    let childData = childSnapshot.val(); // this is the user's data
    db.collection('cats').doc(childData.cat).set(childData); // each cat is written to Cloud Firestore
  })
});

return firebase.database().ref('cetaceans').once('value') // get a snapshot of the user's data
.then(function(snapshot) { // then execute a promise on the snapshot
  snapshot.forEach(function(childSnapshot) { // iterate through the user's data
    let childData = childSnapshot.val(); // this is the user's data
    db.collection('cetaceans').doc(childData.cetacean).set(childData); // each whale and dolphin is written to Cloud Firestore
  })
});

컬렉션 및 문서의 데이터 중첩

Firebase Realtime Database를 사용하면 배열의 배열, 객체의 객체, 배열의 객체 또는 객체의 배열을 가질 수 있습니다. Cloud Firebase는 컬렉션 (배열)의 문서 (개체) 및 문서의 컬렉션 만 허용합니다. 즉, Cloud Firebase 데이터는 항상 콜렉션 - 문서 - 콜렉션 - 문서 등으로 구성됩니다.

아마도 중첩 된 배열을 subcollection에 복사하려고합니다.

return firebase.database().ref('dogs').child('girlfriends').once('value') // get a snapshot of the user's data
.then(function(snapshot) { // then execute a promise on the snapshot
  snapshot.forEach(function(childSnapshot) { // iterate through the user's data
    let childData = childSnapshot.val(); // this is the user's data
    db.collection('dogs').doc(childData.word).set(childData); // write the data to Cloud Firestore
    db.collection('dogs').doc('dogs').collection('girlfriends').doc(childData.dog).set(childData);

  })
});

여기서 우리는 어레이 dogs 에서 배열 girlfriends 를 얻고, forEach 루프로 배열을 반복하고 컬렉션 레코드에있는 문서 dogs 에있는 컬렉션 girlfriends 에게 각 레코드를 작성합니다. 나는 상위 컬렉션과 상위 문서 dogs 모두에 이름을지었습니다. 다른 이름을 사용할 수 있습니다.

코드 업데이트

이제 코드를 업데이트 할 차례입니다.

참조 업데이트

이미 한 줄의 코드를 업데이트했습니다. Firebase Realtime Database 참조를 업데이트했습니다 :

let ref = firebase.database().ref();

클라우드 파이어 스토어 :

let db = firebase.firestore();

Firebase Realtime Database 레퍼런스를 잠시 떠날 수 있습니다. 그리고 끝나면 주석으로 달거나 제거 할 수 있습니다.

users 배열에 다른 Firebase Realtime Database 참조가 있습니다.

let users = firebase.database().ref('users');

다음과 같이 업데이트 할 예정입니다.

let usersFS = firebase.firestore().collection('users');

마이그레이션이 완료 될 때까지 두 데이터베이스를 함께 실행할 수 있도록 다른 이름을 사용합니다.

쿼리 업데이트

이제 쿼리를 업데이트 할 수 있습니다. 내 컨트롤러에서 내 첫 번째 firebase.database().ref 쿼리는 다음과 같습니다.

firebase.database().ref('userLoginEvent').update({'user': user.uid})

Cloud Firestore의 경우 다음과 같이 대신 사용합니다.

db.collection('userLoginEvent').doc('HUSEj7dPh8xsOw32feQY').update({'user': user.uid});

이 코드는 Cloud Firestore가 컬렉션에 문서를 지정해야한다는 것을 제외하면 거의 동일합니다. 여기서는이 명령이 항상 데이터베이스의 동일한 위치에 쓰므로 문서의 키를 참조합니다.

다음, 나는 가지고있다 :

firebase.database().ref('users').child($scope.userAccountKey).update(englishWords);

다음과 같이 업데이트 할 예정입니다.

db.collection('users').doc($scope.userAccountKey).update(englishWords);  // this isn't working

그리고 누가 클라우드 파이어 스토어라고 명명 된 마케팅에 누가 있습니까?

이름이 너무 길어! 도메인 이름을 살펴보면 fire.me 는 여전히 사용할 수 있습니다. 왜 마케팅에 아무도 그 짧은, 기억에 남는 도메인 이름을 제안 궁금해?

Firebase에 의해 Cloud Firestore에 관한 좋은 소식을 여러분 모두 얻을 수 있기를 바랍니다 .

파이어 폭스 데이터베이스클라우드 파이어 스토어 로 변환하고 싶다면 간단하게 변환 할 수 있습니까?

클라우드 파이어 스토어로 이사하고 싶습니다.


데이터 모델이 매우 다르므로이를 달성하는 자동 방법이 없습니다. 앱의 필요에 따라 고유 한 메소드를 작성해야합니다.

설명서 는 차이점에 대한 개요를 제공합니다.





google-cloud-firestore