如何将具有自定义 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

如何编写自定义函数将文档拆分为具有相同 ID 的多个文档

添加具有特定ID的文档而不覆盖现有ID

如何在flutter中将具有文档ID的自定义对象设置为firestore中的集合?

使用 FirestoreRecyclerAdapter 时如何获取 Firestore 文档 ID?

Magento 2.3.5:使用自定义选项和价格将产品添加到购物车