Firebase 是否可以在添加之前获取ID?

Firebase 是否可以在添加之前获取ID?,firebase,google-cloud-platform,google-cloud-firestore,Firebase,Google Cloud Platform,Google Cloud Firestore,我知道在实时数据库中,我可以在像这样添加推送ID之前获取它: DatabaseReference databaseReference= FirebaseDatabase.getInstance().getReference(); String challengeId=databaseReference.push().getKey(); 然后我可以用这个ID添加它 我也可以在云Firestore中获得它吗?这在中有介绍。请参阅“添加文档”部分的最后一段 DocumentReference r

我知道在
实时数据库
中,我可以在像这样添加
推送ID之前获取它:

 DatabaseReference databaseReference= FirebaseDatabase.getInstance().getReference();
 String challengeId=databaseReference.push().getKey();
然后我可以用这个ID添加它

我也可以在
云Firestore中获得它吗?

这在中有介绍。请参阅“添加文档”部分的最后一段

DocumentReference ref = db.collection("my_collection").doc();
String myId = ref.id;

您可以通过以下方式执行此操作(代码适用于AngularFire2 v5,它类似于firebase SDK的任何其他版本,如web、node等)

projectsRef是firestore集合参考

数据是一个具有要上载到firestore的键和值的对象

afs是在构造函数中注入的angularfirestore模块

这将在集合中生成一个名为projectsRef的新文档,其id为pushKey,并且该文档的pushKey属性与文档的id相同

请记住,set还将删除任何现有数据


实际上.add()和.doc().set()是相同的操作。但是使用.add()可以自动生成id,使用.doc().set()可以提供自定义id。

IDK,如果这有帮助的话,但是我想从Firestore数据库中获取文档的id,即已经输入控制台的数据

const db = firebase.firestore();
const ref = db.collection('your_collection_name').doc();
const id = ref.id;
我想要一种快速访问该ID的简单方法,因此我简单地将其添加到document对象中,如下所示:

const querySnapshot = await db.collection("catalog").get();
      querySnapshot.forEach(category => {
        const categoryData = category.data();
        categoryData.id = category.id;
现在,我可以像访问任何其他属性一样访问该
id


IDK为什么
id
首先不仅仅是
.data()
的一部分

这对我很有用。我在同一事务中更新文档。我创建文档并立即使用文档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")
                    }
                }
            }
        }

如果能找到一种更干净的方法,我会很高兴,但在那之前,这对我来说是可行的。

不幸的是,这不起作用:

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])
}
这不是最漂亮的,但这是实现你要求的唯一途径。此代码位于dart中的Swift 5中,您可以使用:

`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");
 });`
在节点中

var id = db.collection("collection name").doc().id;
最简单且最新(2019年)的方法是对主要问题的正确答案:

“是否可以在添加之前获取ID?”


在Python上保存后获取ID:

doc_ref = db.collection('promotions').add(data)
return doc_ref[1].id
对于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 }
希望这能很好地解释它是如何工作的

我们可以在文档中看到
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);
}

您可以使用助手方法生成Firestore ish 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;
}
/**
*生成字符串,例如用作文档ID
*@param{number}随机字符串的长度,firebase的默认值为20
*@return{string}一个strich,比如tyCiv5FpxRexG9JX4wjP
*/
函数getDocumentId(len=20):字符串{
const list=“abcdefghijklmnopqrstuvxyzabcdefghijklmnpqrstuvwxyz123456789”;
让res=“”;
for(设i=0;i

用法:
const myId=getDocumentId()

您能重新检查一下吗?这已经不起作用了。执行
.doc()
会出现一个typescript错误,即需要一个参数。通过执行
此.db.collection('collections').ref.doc().id,使用angularFire2使其正常工作。上面的代码对我不起作用。我得到的错误消息是getId()不是函数。对于@krvIs的答案确实不推荐使用,您必须使用Alberto答案中的代码。我已经用更新的答案替换了旧的API。请解释您的答案,不要只是扔掉代码。我使用的是vue fire,这一个对我有用。谢谢。@SterlingArcher有什么要解释的?诚实的问题。@Ruan很久以前有人告诉我,一个典型的考虑是“如果不需要解释,那就是一个问题”。在此基础上,我们假设,既然我们回答了一个问题,通常需要解释为什么需要帮助learn@Ruan*这是如何工作的*它是否仅适用于自动生成的密钥*它是否适用于事务*我是否会在执行更新之前或之后获取值*此答案是最新的,还是有所更改。根据经验,请不要发布没有引用源代码或解释的代码片段,并怀疑这样做是否是一种好的做法。这肯定是有意义的,除了在一段时间内简化数据模型的客户端使用,因为我已经看过了,但我不知道这种方法有什么“不好”的地方。
try 
{
    var generatedID = currentRef.doc();
    var map = {'id': generatedID.id, 'name': 'New Data'};
    currentRef.doc(generatedID.id).set(map);
}
catch(e) 
{
    print(e);
}
/**
 * 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;
}