【问题标题】:How to add Document with Custom ID to firestore如何将具有自定义 ID 的文档添加到 Firestore
【发布时间】:2018-07-10 12:14:45
【问题描述】:

是否有机会使用自定义生成的 id 将文档添加到 firestore 集合,而不是由 firestore 引擎生成的 id?

【问题讨论】:

    标签: javascript firebase google-cloud-firestore


    【解决方案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中添加的任何东西

            【讨论】:

              猜你喜欢
              • 2022-01-21
              • 2019-05-04
              • 2019-08-15
              • 2019-02-27
              • 1970-01-01
              • 2021-10-04
              • 1970-01-01
              • 1970-01-01
              • 2021-07-05
              相关资源
              最近更新 更多