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


Answers:


145

文档中对此进行了介绍。请参阅添加文档部分的最后一段。

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

3
添加之前获取生成的ID是否有可能覆盖添加后的其他数据?(因为此ID是在...之前生成的)
Tal Barda

11
得到它的工作使用angularFire2做this.db.collection('collections').ref.doc().id
KRV

2
上面的代码对我不起作用。我收到错误消息,说getId()不是函数。对于工作,@ krv的答案
stackovermat

2
确实已弃用,您必须使用Alberto的答案中的代码
kevinius

2
我已更新此答案以替换旧的api。
雨果·格雷斯

45
const db = firebase.firestore();
const ref = db.collection('your_collection_name').doc();
const id = ref.id;

14
请解释您的答案,而不仅仅是转储代码
Sterling Archer

我正在使用vue-fire,而这对我有用。谢谢。
Gene Parcellano,

6
@SterlingArcher有什么要解释的?诚实的问题。

2
@Ruan一个很久以前告诉我的典型考虑是“如果不需要解释,那将是一个问题”。在此基础上,我们假设自从回答问题以来,通常就解释了为什么需要帮助进行解释
Sterling Archer

21

您可以按以下方式执行此操作(代码适用于AngularFire2 v5,类似于任何其他版本的Firebase SDK,例如网络,节点等)

const pushkey = this.afs.createId();
const project = {' pushKey': pushkey, ...data };
this.projectsRef.doc(pushkey).set(project);

projectsRef是Firestore集合参考。

数据是具有键,要上传到Firestore的值的对象。

AFS是在构造函数中注入angularfirestore模块。

这将在Collection处生成一个名为projectsRef的新文档,其ID为pushKey,并且该文档的pushKey属性与document的ID相同。

记住,设置还将删除所有现有数据

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


4

如果有帮助,则使用IDK,但我想从Firestore数据库中获取文档的ID,即已经输入到控制台中的数据。

我想要一种快速访问该ID的简单方法,因此我只是将其添加到文档对象中,如下所示:

const querySnapshot = await db.collection("catalog").get();
      querySnapshot.forEach(category => {
        const categoryData = category.data();
        categoryData.id = category.id;

现在,我可以id像访问其他任何属性一样访问它。

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


想知道这样做是否是一个好习惯。除了简化数据模型的客户端使用之外,这当然也很有意义
wiwi

自从我查看了一段时间以来,但是我不知道这种方法有什么“坏”之处。
CodeFinity

4

最简单和更新(2019)的方法是对主要问题的正确答案:

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

// 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 (object that you want to insert) with its uuid as property
const response = await document.set({
      ...yourObjectToInsert,
      uuid: documentUuid
});

2

不幸的是,这行不通:

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


1

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

1

对于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 }

希望能很好地解释这是如何工作的


0

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

找到一个更干净的方法会很高兴,但是在那之前这对我有用。


0

在节点中

var id = db.collection("collection name").doc().id;

0

在Python上保存后获取ID:

doc_ref = db.collection('promotions').add(data)
return doc_ref[1].id

0

生成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);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.