火恢复-如何获得文档标识后,添加一个文档到集合

是否有方法获取在向集合添加文档后生成的文档 ID?

如果我将一个文档添加到代表社交媒体应用程序中的“ post”的集合中,我希望获得该文档 ID,并将其用作另一个集合中的另一个文档中的字段。

如果我不能得到在添加文档后生成的文档 ID,那么我是否应该计算一个随机字符串并在创建文档时提供 Id?这样我可以使用相同的字符串作为字段在我的其他文档?

快速结构示例:

POST (collection)
Document Id - randomly generated by firebase or by me
USER (collection)
Document Id - randomly generated by firebase
userPost: String (this will be the document id
in the post collection that I'm trying to get)
105614 次浏览

是的,有可能。当对集合调用 .add方法时,将返回一个 DocumentReference 对象。DocumentReference 具有 id字段,因此您可以在创建文档之后获取 id。

// Add a new document with a generated id.
db.collection("cities").add({
name: "Tokyo",
country: "Japan"
})
.then(function(docRef) {
console.log("Document written with ID: ", docRef.id);
})
.catch(function(error) {
console.error("Error adding document: ", error);
});

这个例子是在 JavaScript 中。请访问 文件了解其他语言。

如果使用承诺,我建议使用胖箭头函数,因为它打开了甚至在 .then函数中使用 this.foo的可能性

    db.collection("cities").add({
name: "Tokyo",
country: "Japan"
})
.then(docRef => {
console.log("Document written with ID: ", docRef.id);
console.log("You can now also access this. as expected: ", this.foo)
})
.catch(error => console.error("Error adding document: ", error))

使用 function(docRef)意味着您无法访问 this.foo,并且将抛出错误

    .then(function(docRef) {
console.log("Document written with ID: ", docRef.id);
console.log("You can now NOT access this. as expected: ", this.foo)
})

脂肪箭头函数允许您按预期访问 this.foo

    .then(docRef => {
console.log("Document written with ID: ", docRef.id);
console.log("You can now also access this. as expected: ", this.foo)
})

编辑/添加2020:

现在比较流行的方法可能是使用异步/等待代替。注意,必须在函数声明前面添加 async:

    async function addCity(newCity) {
const newCityAdded = await db.collection("cities").add(newCity)
console.log("the new city:", newCityAdded)
console.log("it's id:", newCityAdded.id)
}

如果你只想要本体,那么可以使用解析来获取它。解构允许您在响应中获取任何键/值对:

    async function addCity(newCity) {
const { id } = await db.collection("cities").add(newCity)
console.log("the new city's id:", id)
}

也可以使用解构来获取值并重命名为任何你想要的:

    async function addCity(newCity) {
const { id: newCityId } = await db.collection("cities").add(newCity)
console.log("the new city's id:", newCityId)
}

如果你想用 async/await代替 .then(),你可以这样写:

const post = async (doc) => {
const doc_ref = await db.collection(my_collection).add(doc)
return doc_ref.id
}

如果希望捕获此函数中的任何错误,请包括 .catch():

    const doc_ref = await db.collection(my_collection).add(doc).catch(err => { ... })

或者您可以让调用函数捕获错误。

正如你问题中提到的,我是这么做的。不确定这是否是最佳实践,但它可以方便地访问。

当首先创建文档时

firebase.firestore().collection("cities").doc().set({ name: Tokyo,
country: Japan })

您可以设置文档的 id,并将确切的 id 作为属性放入其中:

firebase.firestore().collection("cities").doc('id-generated-from-somewhere')
.set({ id: 'id-generated-from-somewhere', name: Tokyo, country: Japan })

正如其他人所提到的,一旦添加了文档引用,我们就可以得到它。 在我们代表 id 获得文档引用之后,我们可以更新相同的内容

文件

async funName(data: Data){
let docRef = this.firestore.collection('table-name').add(data);
console.log(docRef)
try {
const docAdded = await docRef;
console.log(docAdded.id);
this.firestore.doc('table-name/' + docAdded.id).update({ id: docAdded.id });
return docRef;
}
catch (err) {
return err;
}
}

Ts 文件

async addData(){
try{
let res =  await this.dataServ.funName(this.form.value);
this.snackbar.open('success', 'Success');
}catch(ex){
this.disabled = false;
this.snackbar.open('err', 'Error')
console.log(ex, 'exception');
}
}

对于 Android,Java,你应该在 set()或者 add()之前获得文档 ID,像这样:

    //Fields:
CollectionReference toolsCollectionRef = FirebaseFirestore.getInstance().collection(toolsCollection);
CustomPOJO_Model toolToPost;
    

//In Methods:
String newDocID= toolsCollectionRef.document().getId();   //Get Doc ID first.
toolToPost.setToolID(newDocID);
    

//Now use the doc ID:
toolsCollectionRef.document(newDocID).set(toolToPost.getConvertedTool_KeyValuePair ()).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
}
});
    

//Re-use same ID in another post:
usersCollectionRef.document(mAuth.getUid()).collection(usersToolsCollection).document(toolToPost.getToolID()).set(toolToPost.getConvertedTool_KeyValuePair());

对于 FB Firestorv9版本(JS/Web) ,请使用以下语法:

import { addDoc, doc, Timestamp, updateDoc } from "firebase/firestore";


//add document to 'posts' collection with auto id
const newItem = await addDoc(collection(db, 'posts'), {
caption: post.value.caption || "No caption provided",
location: post.value.location || "No location provided",
imageUrl: imageUrl.value,
createdAt: Timestamp.now(),
});
                

//get new document id an update it to the file as id field.
const fileID = newItem.id
console.log('added file:', fileID);
const updateDocId = doc(db, "posts", fileID) ;
await updateDoc(updateDocId, {
id: fileID
})

使用 v9,您甚至可以在创建文档之前获得 ID

  • 获取一个新的 docRef 并读取它的随机 id
  • 你可以使用 id
  • 例如,在文档数据中插入 id
  • 然后创建文档
const usersRef = collection(db,'users') // collectionRef
const userRef = doc(usersRef) // docRef
const id = userRef.id // a docRef has an id property
const userData = {id, ...} // insert the id among the data
await setDoc(userRef, userData) // create the document

我不知道为什么这个被淘汰了。这就是我所需要的,我正在寻找添加 doc ()。Set ()代替 doc ()。Add (). 我将使用 uuid 作为文档来搜索我的用户内部集合。

firebase.firestore().collection("cities").doc().set({ name: Tokyo,
country: Japan })