我将数据添加到Firestore,如下所示:
db
.collection('foo')
.add({foo: 'bar'})
.then(docRef => {
console.log('Added Foo: ', docRef.id)
// do some stuff here with the newly created foo and it's id.
})
.catch(console.error)
创建文档后,我想使用新文档或特别是ID。该文档存储在具有有效ID的本地数据库中。
但是如何在创建文档后获取ID?在数据与服务器同步之前,将不会解析承诺。
答案 0 :(得分:1)
您甚至可以在本地保存之前获取ID。你只需用这种方式写数据。
// Add a new document with a generated id.
var newCityRef = db.collection("cities").doc();
var id = newCityRef.key;
// later...
newCityRef.set(data);
对于Web,默认情况下禁用脱机持久性。要启用持久性,请调用enablePersistence方法
firebase.firestore().enablePersistence()
.then(function() {
// Initialize Cloud Firestore through firebase
var db = firebase.firestore();
})
.catch(function(err) {
if (err.code == 'failed-precondition') {
// Multiple tabs open, persistence can only be enabled
// in one tab at a a time.
// ...
} else if (err.code == 'unimplemented') {
// The current browser does not support all of the
// features required to enable persistence
// ...
}
要检查您是从服务器还是缓存接收数据,请在快照事件中使用SnapshotMetadata上的fromCache属性。 IffromCache是真的,数据来自缓存,可能是陈旧的或不完整的。如果fromCache为false,则数据是完整的,并且是当前服务器上的最新更新。
默认情况下,如果仅更改了SnapshotMetadata,则不会引发任何事件。如果依赖于fromCache值,请在附加侦听处理程序时指定includeMetadataChanges listen选项。
db.collection("cities").where("state", "==", "CA")
.onSnapshot({ includeQueryMetadataChanges: true }, function(snapshot) {
snapshot.docChanges.forEach(function(change) {
if (change.type === "added") {
console.log("New city: ", change.doc.data());
}
var source = snapshot.metadata.fromCache ? "local cache" : "server";
console.log("Data came from " + source);
});
});
因此,如果您添加新数据并且已启用离线功能,您的数据将被添加到缓存中,并且可以被侦听器监听。
});
答案 1 :(得分:0)
我遇到了这个为我完成工作的解决方法。
db
.collection('foo')
.where('fooCreator', '==', currentUserId)
.onSnapshot(querySnapshot => {
querySnapshot.docChanges.forEach(change => {
if (change.type === 'added' && change.doc._document.hasLocalMutations) {
const fooId = change.doc.id
const foo = change.doc.data()
// do something with foo and fooId
}
})
})
它有效,但我不喜欢它因为:
change.doc._document.hasLocalMutations
检查它是否是新创建的项目