我知道在实时数据库中我可以在添加之前获得
push ID
,如下所示:
DatabaseReference databaseReference= FirebaseDatabase.getInstance().getReference();
String challengeId=databaseReference.push().getKey();
然后我可以使用这个 ID 添加它。
我也可以在 Cloud Firestore 中获取它吗?
这在文档中有介绍。请参阅添加文档部分的最后一段。
DocumentReference ref = db.collection("my_collection").doc();
String myId = ref.id;
const db = firebase.firestore();
const ref = db.collection('your_collection_name').doc();
const id = ref.id;
您可以通过以下方式执行此操作(代码适用于 AngularFire2 v5,它类似于任何其他版本的 firebase SDK,例如 Web、节点等)
const pushkey = this.afs.createId();
const project = {' pushKey': pushkey, ...data };
this.projectsRef.doc(pushkey).set(project);
projectsRef 是 firestore 集合参考。
data 是一个带有要上传到 firestore 的键、值的对象。
afs 是在构造函数中注入的 angularfirestore 模块。
这将在集合中生成一个名为projectsRef的新文档,其id为pushKey,并且该文档将具有与文档id相同的pushKey属性。
请记住,设置还将删除任何现有数据
实际上.add()和.doc().set()是相同的操作。但是使用 .add() id 是自动生成的,使用 .doc().set() 你可以提供自定义 id。
Firebase 9
doc(collection(this.afs, 'posts')).id;
最简单且更新的(2022)方法,这是主要问题的正确答案:
“是否可以获取添加前的ID?”
v8:
// Generate "locally" a new document in a collection
const document = yourFirestoreDb.collection('collectionName').doc();
// Get the new document Id
const documentUuid = document.id;
// Sets the new document with its uuid as property
const response = await document.set({
uuid: documentUuid,
...
});
v9:
// Get the collection reference
const collectionRef = collection(yourFirestoreDb,'collectionName');
// Generate "locally" a new document for the given collection reference
const docRef = doc(collectionRef);
// Get the new document Id
const documentUuid = docRef.id;
// Sets the new document with its uuid as property
await setDoc(docRef, { uuid: documentUuid, ... })
IDK 如果这有帮助,但我想从 Firestore 数据库获取文档的 id - 即已经输入控制台的数据。
我想要一种简单的方法来动态访问该 ID,所以我只是将其添加到文档对象中,如下所示:
const querySnapshot = await db.collection("catalog").get();
querySnapshot.forEach(category => {
const categoryData = category.data();
categoryData.id = category.id;
现在,我可以访问该
id
就像访问任何其他财产一样。
不知道为什么
id
首先不只是 .data()
的一部分!
对于 Node.js 运行时
const documentRef = admin.firestore()
.collection("pets")
.doc()
await admin.firestore()
.collection("pets")
.doc(documentRef.id)
.set({ id: documentRef.id })
这将创建一个具有随机ID的新文档,然后将文档内容设置为
{ id: new_document_id }
希望能很好地解释这是如何工作的
现在可以通过在本地生成 Id(v9 2022 更新)来实现:
import { doc, collection, getFirestore } from 'firebase/firestore'
const collectionObject = collection(getFirestore(),"collection_name")
const docRef = doc(collectionObject)
console.log(docRef.id) // here you can get the document ID
可选:此后您可以创建任何这样的文档
setDoc(docRef, { ...docData })
希望这对某人有帮助。干杯!
不幸的是,这行不通:
let db = Firestore.firestore()
let documentID = db.collection(“myCollection”).addDocument(data: ["field": 0]).documentID
db.collection(“myOtherCollection”).document(documentID).setData(["field": 0])
它不起作用,因为第二条语句在 documentID 完成获取文档 ID 之前执行。所以,你必须等待 documentID 加载完成才能设置下一个文档:
let db = Firestore.firestore()
var documentRef: DocumentReference?
documentRef = db.collection(“myCollection”).addDocument(data: ["field": 0]) { error in
guard error == nil, let documentID = documentRef?.documentID else { return }
db.collection(“myOtherCollection”).document(documentID).setData(["field": 0])
}
这不是最漂亮的,但这是实现您要求的唯一方法。该代码位于
Swift 5
。
我们可以在文档中看到
doc()
方法。他们将生成新的 ID,并在此基础上创建新的 ID。然后使用set()
方法设置新数据。
try
{
var generatedID = currentRef.doc();
var map = {'id': generatedID.id, 'name': 'New Data'};
currentRef.doc(generatedID.id).set(map);
}
catch(e)
{
print(e);
}
对于新的 Firebase 9(2022 年 1 月)。就我而言,我正在开发一个评论部分:
const commentsReference = await collection(database, 'yourCollection');
await addDoc(commentsReference, {
...comment,
id: doc(commentsReference).id,
date: firebase.firestore.Timestamp.fromDate(new Date())
});
用
commentsReference
包裹集合引用 (
doc()
) 可提供标识符 (id
)
在Python上保存后获取ID:
doc_ref = db.collection('promotions').add(data)
return doc_ref[1].id
在 dart 中你可以使用:
`var itemRef = Firestore.instance.collection("user")
var doc = itemRef.document().documentID; // this is the id
await itemRef.document(doc).setData(data).then((val){
print("document Id ----------------------: $doc");
});`
您可以使用辅助方法生成类似 Firestore 的 ID,然后调用
collection("name").doc(myID).set(dataObj)
而不是 collection("name").add(dataObj)
。如果 ID 不存在,Firebase 将自动创建文档。
辅助方法:
/**
* generates a string, e.g. used as document ID
* @param {number} len length of random string, default with firebase is 20
* @return {string} a strich such as tyCiv5FpxRexG9JX4wjP
*/
function getDocumentId (len = 20): string {
const list = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ123456789";
let res = "";
for (let i = 0; i < len; i++) {
const rnd = Math.floor(Math.random() * list.length);
res = res + list.charAt(rnd);
}
return res;
}
用法:
const myId = getDocumentId()
。
如果您在需要 id 时不知道集合是什么:
这是 Firestore 用于生成 id 的代码:
const generateId = (): string => {
// Alphanumeric characters
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
let autoId = '';
for (let i = 0; i < 20; i++) {
autoId += chars.charAt(Math.floor(Math.random() * chars.length));
}
// assert(autoId.length === 20, "Invalid auto ID: " + autoId);
return autoId;
};
参考资料:
这对我有用。我在同一交易中更新文档。我创建文档并立即使用文档 ID 更新文档。
let db = Firestore.firestore().collection(“cities”)
var ref: DocumentReference? = nil
ref = db.addDocument(data: [
“Name” : “Los Angeles”,
“State: : “CA”
]) { err in
if let err = err {
print("Error adding document: \(err)")
} else {
print("Document added with ID: \(ref!.documentID)")
db.document(ref!.documentID).updateData([
“myDocumentId” : "\(ref!.documentID)"
]) { err in
if let err = err {
print("Error updating document: \(err)")
} else {
print("Document successfully updated")
}
}
}
}
如果能找到一种更干净的方法来做到这一点就好了,但在那之前这对我有用。
在节点中
var id = db.collection("collection name").doc().id;
在颤振中:
DocumentReference docRef = yourRef.doc(); //get the premisse ref
final String yourNewDocId = docRef.id; //get the id
docRef.set({'your data' : 'here'}); //save the data on the id you just get