如何使用 FirestoreDataConverter 进行更新?

tax*_*ree 8 firebase typescript google-cloud-firestore

我正在尝试使用FirestoreDataConverter来转换对象来存储数据,但转换器似乎仅适用于 和addDoc操作setDoc,但是当尝试将其与updateDoc操作一起使用时,它不会触发该toFirestore函数。

可重现的例子

interface Post {
  author: string;
  content: string;
}

async function addAndUpdatePost() {
  const colRef = collection(firestore, 'posts')
    .withConverter(postConverter);
  const post: Post = { author: 'Author', content: 'Content'};
  const docRef = doc(colRef);
  await setDoc(docRef, post);                      // Triggers toFirestore function
  const addedPost = (await getDoc(docRef)).data(); // Triggers fromFirestore function
  if (!addedPost) return;
  await updateDoc(docRef, addedPost)               // Does NOT trigger toFirestore function
}

const postConverter: FirestoreDataConverter<Post> = {
  toFirestore(post: Post): DocumentData {
    console.log("Went through to-converter");
    return { ...post};
  },

  fromFirestore(docSnap: QueryDocumentSnapshot): Post {
    console.log("Went through from-converter")
    return docSnap.data() as Post;
  },
};
Run Code Online (Sandbox Code Playgroud)

预期的控制台输出

Went through to-converter
Went through from-converter
Went through to-converter
Run Code Online (Sandbox Code Playgroud)

实际控制台输出

Went through to-converter
Went through from-converter
Run Code Online (Sandbox Code Playgroud)

这种情况特别发生在updateDoc. 如果我使用setDoc它,它会按预期工作。是updateDoc根本不支持吗?文档中似乎根本没有提到它。 https://firebase.google.com/docs/reference/node/firebase.firestore.FirestoreDataConverter

小智 2

该转换器旨在帮助转换顶层 ( T) 数据结构。在 中set(),您传递给它的数据类型是 或Tpartial T这就是转换器生效的原因。

另一方面,update()用于更新字段,其中字段可以位于 Document 中的嵌套数据结构内,并且不是必需的partial T。所以它不会触发转换器。