是否可以获取添加前的ID?

问题描述 投票:0回答:18

我知道在实时数据库中我可以在添加之前获得

push ID
,如下所示:

 DatabaseReference databaseReference= FirebaseDatabase.getInstance().getReference();
 String challengeId=databaseReference.push().getKey();

然后我可以使用这个 ID 添加它。

我也可以在 Cloud Firestore 中获取它吗?

firebase google-cloud-platform google-cloud-firestore
18个回答
224
投票

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

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

52
投票
const db = firebase.firestore();
const ref = db.collection('your_collection_name').doc();
const id = ref.id;

26
投票

您可以通过以下方式执行此操作(代码适用于 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。


23
投票

Firebase 9

doc(collection(this.afs, 'posts')).id;

21
投票

最简单且更新的(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, ... }) 

6
投票

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()
的一部分!


6
投票

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

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


4
投票

现在可以通过在本地生成 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 })

希望这对某人有帮助。干杯!


3
投票

不幸的是,这行不通:

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


2
投票

生成 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);
}

2
投票

对于新的 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
)


1
投票

在Python上保存后获取ID:

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

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
投票

您可以使用辅助方法生成类似 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()


1
投票

如果您在需要 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;
};

参考资料:

Firestore:id 在集合中还是全局中是唯一的?

https://github.com/firebase/firebase-js-sdk/blob/73a586c92afe3f39a844b2be86086fddb6877bb7/packages/firestore/src/util/misc.ts#L36


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
投票

在颤振中:

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
© www.soinside.com 2019 - 2024. All rights reserved.