如何将具有自定义ID的文档添加到firestore(Angular)

Har*_*ent 45 javascript firebase google-cloud-firestore

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

在此先感谢您的回复.

Fin*_*rcy 92

要使用您需要使用的自定义ID .set,而不是.add

这将创建一个ID为"LA"的文档:

db.collection("cities").doc("LA").set({
    name: "Los Angeles",
    state: "CA",
    country: "USA"
})
Run Code Online (Sandbox Code Playgroud)

这取自这里的官方文档

  • `.add()` 等价于 `.doc().set()` (10认同)
  • 如果我们想添加客户 ID 那么我们必须使用 .doc().set() 而不是 add() (4认同)
  • 如果您使用 set() 方法来更新文档字段,请小心,它会杀死文档中未更新的字段。例如。我的文档中有 6 个字段,我只更新了 4 个字段,然后 set() 方法从 firestore 上的该文档中删除了 2 个字段及其信息。只是分享我的经验。谢谢。 (2认同)

ten*_*shi 31

如果有人正在寻找版本 9,我会将其留在这里。

这是从文档中获取的。

import { doc, setDoc } from "firebase/firestore"; 

// Add a new document in collection "cities" with "LA" as id
await setDoc(doc(db, "cities", "LA"), {
  name: "Los Angeles",
  state: "CA",
  country: "USA"
});
Run Code Online (Sandbox Code Playgroud)

哪里db

const firebaseApp = initializeApp(firebaseConfig)
const db = getFirestore(firebaseApp)
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。效果很好!这是官方链接:https://firebase.google.com/docs/firestore/manage-data/add-data#web-version-9 (2认同)

Dav*_*yen 10

为了扩展已接受的答案,如果您希望您的客户在推送到 Firestore 之前为文档生成一个随机 ID(假设在createId()AngularFire2 之外存在相同的功能)

const newId = db.createId();
db.collection("cities").doc(newId).set({
    name: "Los Angeles",
    state: "CA",
    country: "USA"
})

Run Code Online (Sandbox Code Playgroud)

这对于将 ID 设置为另一个文档中的参考字段非常有用,甚至在 Firestore 保存任何内容之前也是如此。如果您不需要立即使用保存的对象,这不会让您等待 ID,从而加快进程。该set()调用现在与您可能在 Angular 中使用的管道异步

注意我没有放入id: newIdset 对象,因为默认情况下 Firestore 不会将 ID 保存为文档中的字段


Pap*_*ojo 9

this.afs.collection('[your collection]').doc('[your ID]').set([your document]);
Run Code Online (Sandbox Code Playgroud)

  • 一些解释在这里会有所帮助! (4认同)

Tar*_*epp 6

这是用数据创建文档的功能,您可以选择是否要自己生成ID或自动生成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()
    }
  }
Run Code Online (Sandbox Code Playgroud)

非模块化 Firebase firestore 具有相同的功能(<版本 9)

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()
    }
  }
Run Code Online (Sandbox Code Playgroud)


Jon*_*ave 5

你可以这样做

// 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);
Run Code Online (Sandbox Code Playgroud)