【发布时间】:2018-07-10 12:14:45
【问题描述】:
是否有机会使用自定义生成的 id 将文档添加到 firestore 集合,而不是由 firestore 引擎生成的 id?
【问题讨论】:
标签: javascript firebase google-cloud-firestore
是否有机会使用自定义生成的 id 将文档添加到 firestore 集合,而不是由 firestore 引擎生成的 id?
【问题讨论】:
标签: javascript firebase google-cloud-firestore
要使用自定义 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()
如果你使用 angularfire,
class Component{
constructor(private afs: AngularFireStore) {} // imported from @angular/fire/firestore
addItem() {
this.afs.collection('[your collection]').doc('[your ID]').set({your: "document"});
}
}
【讨论】:
为了扩展已接受的答案,如果您希望您的客户在推送到 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 保存为文档中的字段
【讨论】:
你可以这样做
// 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);
【讨论】:
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();
}
});
}
【讨论】:
这是使用数据创建文档的功能,您可以选择是自己生成还是自动生成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()
}
}
【讨论】:
使用 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);
【讨论】:
首先给出的代码用于 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吗?
如果您想添加自定义 id 而不是 firestore 生成的,那么只需执行以下操作:
val u:String=FirebaseAuth.getInstance().currentUser?.uid.toString() FirebaseFirestore.getInstance().collection("店铺详情").document(u).set(data)
//u 不在 Firestore 中,它会先创建并添加数据 //data是你想在firestore中添加的任何东西
【讨论】: