希望大家都能收到Firebase的Cloud Firestore的好消息。
我想把我的Firebase数据库转换成Cloud Firestore,有没有简单的方法可以转换?
我想迁移到Cloud Firestore。
希望大家都能收到Firebase的Cloud Firestore的好消息。
我想把我的Firebase数据库转换成Cloud Firestore,有没有简单的方法可以转换?
我想迁移到Cloud Firestore。
dogs
中与name
等于China
的对象,并返回字段phone_number
。我必须告诉Firebase下载整个数组,然后运行forEach
循环以迭代每个对象,查找name === China
。这被称为“深度查询”,因为它返回数组中的每个对象,每个子数组和所有嵌套的子级。我的狗有很多女朋友,下载所有内容可能需要几秒钟!-KloeQHDC-mugPjJMAG4
。如果你跟踪一个对象的键,你可以轻松地从数据库中检索该对象。例如,当新用户使用 Facebook 登录并在 Auth 数据库中创建记录时,然后在实时数据库中创建用户帐户,你可以将用户的身份验证密钥作为键值对存储在用户帐户中,以便可以轻松地找到与此用户相关联的身份验证数据(displayName
、photoURL
等)。dogs
数组,请求名称等于 China
的记录。Firebase 只返回我想要的对象。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>
或者下载Node模块并链接:
npm install firebase@4.5.0 --save
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.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实时数据库迁移到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 实时数据库键。但它不起作用,因为您无法上传集合到 Cloud Firestore,只能上传文档。
在前一个示例中,forEach
循环遍历每个记录,并将其作为文档上传到 Cloud Firestore。集合会自动创建,并命名为 dogs
。这也会删除 Firebase 实时数据库键,并替换为 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实时数据库允许您在数组中嵌套数组,在对象中嵌套对象,在对象中嵌套数组或在数组中嵌套对象。Cloud Firebase只允许在集合(数组)中放置文档(对象),以及在文档中放置集合。换句话说,Cloud Firebase的数据始终是按照集合-文档-集合-文档等结构进行组织的。
也许您想将一个嵌套的数组复制到一个子集合中:
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
循环遍历该数组,并将每个记录写入集合girlfriends
的文档dogs
中。我将顶级集合和顶级文档都命名为dogs
。您可以使用不同的名称。
现在我们开始更新我们的代码。
我们已经更新了一行代码。我们更新了Firebase实时数据库引用:
let ref = firebase.database().ref();
转到Cloud Firestore:
let db = firebase.firestore();
暂时可以不用考虑 Firebase 实时数据库的引用,等到我们完成后再将其注释或删除。
我还有另一个 Firebase 实时数据库引用,指向我的 users
数组:
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 并没有提供自动迁移工具,否则在许多情况下会导致数据结构低效。
在不久的将来,他们将发布一份指南,详细介绍 RTDB 开发人员如何使用 Cloud Firestore 的最佳实践,敬请关注!
来源链接 - Google Firebase 群组
Firebase 实时数据库: 所有 Firebase 实时数据库数据都存储为 JSON 对象。您可以将数据库视为托管在云端的 JSON 树。与 SQL 数据库不同,没有表格或记录。当您向 JSON 树添加数据时,它将成为现有 JSON 结构中的一个节点,并带有关联的键。您可以提供自己的键,例如用户 ID 或语义名称。
Example
{
data: {
first: "foo",
last: "bar",
dob: 1993,
}
}
云 Firestore:在云 Firestore 中,存储的单位是文档。文档是一个轻量级记录,包含映射到值的字段。每个文档都有一个名称作为其标识符。 代表用户 alovelace 的文档可能如下所示:
document
first : "foo"
last : "bar"
dob : 1994