如何将具有自定义 ID 的文档添加到 Firestore
Posted
技术标签:
【中文标题】如何将具有自定义 ID 的文档添加到 Firestore【英文标题】:How to add Document with Custom ID to firestore 【发布时间】:2018-07-10 12:14:45 【问题描述】:是否有机会使用自定义生成的 id 将文档添加到 firestore 集合,而不是由 firestore 引擎生成的 id?
【问题讨论】:
【参考方案1】:要使用自定义 ID,您需要使用 .set
,而不是 .add
这将创建一个 ID 为“LA”的文档:
db.collection("cities").doc("LA").set(
name: "Los Angeles",
state: "CA",
country: "USA"
)
本文摘自官方文档here
【讨论】:
如果我想添加到文档"LA"
怎么办?这不起作用:.doc("LA").add(...)
请告诉我该怎么做。
.add()
等价于.doc().set()
如果我们想添加客户 ID,那么我们必须使用 .doc().set() 而不是 add()
如果您使用 set() 方法更新文档字段,请小心,它会杀死文档中未更新的字段。例如。我在一个文档中有 6 个字段,我只更新了 4 个字段,然后 set() 方法从 firestore 上的该文档中删除了 2 个字段及其信息。只是分享我的经验。谢谢。【参考方案2】:
如果你使用 angularfire,
class Component
constructor(private afs: AngularFireStore) // imported from @angular/fire/firestore
addItem()
this.afs.collection('[your collection]').doc('[your ID]').set(your: "document");
【讨论】:
这里有一些解释会有所帮助!【参考方案3】:为了扩展已接受的答案,如果您希望您的客户在推送到 Firestore 之前为文档生成一个随机 ID(假设相同的 createId()
函数存在于 AngularFire2 之外)
const newId = db.createId();
db.collection("cities").doc(newId).set(
name: "Los Angeles",
state: "CA",
country: "USA"
)
这对于将 ID 设置为另一个文档中的参考字段非常有用,即使在 Firestore 保存任何内容之前也是如此。如果您不需要立即使用保存的对象,则无需等待 ID 即可加快处理速度。 set()
调用现在与您可能在 Angular 中使用的管道异步
请注意,我没有将 id: newId
放在 set 对象中,因为默认情况下 Firestore 不会将 ID 保存为文档中的字段
【讨论】:
优秀,感谢db.createId()的提示,很有用 请注意操作可能会失败(出于任何原因),因此不要假设存在具有该 ID 的已保存对象(或在这种情况下有某种回退)。跨度> 【参考方案4】:你可以这样做
// Inject AngularFirestore as dependency
private angularFireStore: AngularFirestore // from from 'angularfire2/firestore'
// set user object to be added into the document
let user =
id: this.angularFireStore.createId(),
name: 'new user'
...
// Then, finally add the created object to the firebase document
angularFireStore.collection('users').doc(user.id).set(user);
【讨论】:
【参考方案5】:db.collection("users").document(mAuth.getUid()).set(user)
这里,集合的名称是"users"
,文档名称是用户的UID
这里你需要使用set
而不是add
private void storeData(String name, String email, String phone)
// Create a new user with a first and last name
Map<String, Object> user = new HashMap<>();
user.put("name", name);
user.put("email", email);
user.put("phone", phone);
// Add a new document with a generated ID
db.collection("users").document(mAuth.getUid()).set(user)
.addOnSuccessListener(new OnSuccessListener<Void>()
@Override
public void onSuccess(Void aVoid)
Toasty.success(context,"Register sucess",Toast.LENGTH_SHORT).show();
);
【讨论】:
【参考方案6】:这是使用数据创建文档的功能,您可以选择是自己生成还是自动生成id。如果在函数调用期间提供了 id,那么将创建的文档将具有您提供的 id。
模块化 Firebase Firestore 9.+
import getFirestore, serverTimestamp, collection, doc, setDoc, addDoc from 'firebase/firestore/lite'
async create(id = null, data)
const collectionRef = collection(getFirestore(), this.collectionPath)
const dataToCreate =
...data,
createTimestamp: serverTimestamp(),
updateTimestamp: serverTimestamp()
const createPromise =
id === null || id === undefined
? // Create doc with generated id
await addDoc(collectionRef, dataToCreate).then(d => d.id)
: // Create doc with custom id
await setDoc(doc(collectionRef, id), dataToCreate).then(() => id)
const docId = await createPromise
return
id: docId,
...data,
createTimestamp: new Date(),
updateTimestamp: new Date()
非模块化 Firebase firestore 的相同功能(
import firebase from '@firebase/app'
async create(data, id = null)
const collectionRef = (await firestore()).collection(this.collectionPath)
const serverTimestamp = firebase.firestore.FieldValue.serverTimestamp()
const dataToCreate =
...data,
createTimestamp: serverTimestamp,
updateTimestamp: serverTimestamp
const createPromise =
id === null || id === undefined
? // Create doc with generated id
collectionRef.add(dataToCreate).then(doc => doc.id)
: // Create doc with custom id
collectionRef
.doc(id)
.set(dataToCreate)
.then(() => id)
const docId = await createPromise
return
id: docId,
...data,
createTimestamp: new Date(),
updateTimestamp: new Date()
【讨论】:
【参考方案7】:使用 ID 创建新文档
createDocumentWithId<T>(ref: string, document: T, docId: string)
return this.afs.collection(ref).doc<T>(docId).set(document);
EX:此示例以电子邮件作为文档的 ID
this.fsService.createDocumentWithId('db/users', , credential.user.email);
【讨论】:
【参考方案8】:首先给出的代码用于 javascript 这是用于 android Studio (JAVA)
Map<String, Object> city = new HashMap<>();
city.put("name", "Los Angeles");
city.put("state", "CA");
city.put("country", "USA");
//Here LA is Document name for Assigning
db.collection("cities").document("LA")
.set(city)
.addOnSuccessListener(new OnSuccessListener<Void>()
@Override
public void onSuccess(Void aVoid)
Log.d(TAG, "DocumentSnapshot successfully written!");
)
.addOnFailureListener(new OnFailureListener()
@Override
public void onFailure(@NonNull Exception e)
Log.w(TAG, "Error writing document", e);
);
要在添加数据时设置 ID,您必须使用 Set 方法
如果此代码已过时,则查找新代码 Here
【讨论】:
...First is for JavaScript
,你是说Java
吗?
@phonixstudio 它是 Java 编程【参考方案9】:
如果您想添加自定义 id 而不是 firestore 生成的,那么只需执行以下操作:
val u:String=FirebaseAuth.getInstance().currentUser?.uid.toString() FirebaseFirestore.getInstance().collection("店铺详情").document(u).set(data)
//u 不在 Firestore 中,它会先创建并添加数据 //data是你想在firestore中添加的任何东西
【讨论】:
以上是关于如何将具有自定义 ID 的文档添加到 Firestore的主要内容,如果未能解决你的问题,请参考以下文章
如何在firestore 9中将具有自定义ID的文档添加到firestore
如何在flutter中将具有文档ID的自定义对象设置为firestore中的集合?