如何使用Firestore和Firebase Functions正确存储数组类型数据?
如何让Firestore将数组正确存储为数组类型而非字符串
嘿,我太懂你遇到的这个问题了!问题根源其实特别简单——你不该用JSON.stringify()把数组转成字符串,这直接导致Firestore把它当成单个字符串值来存储了。Firestore本身原生支持数组类型,完全不需要多做字符串转换这一步。
根据你的实际需求,分两种场景来解决:
场景1:直接将testData字段设置为目标数组(替换原有值)
如果你的需求是把testData字段直接改成['123','hello','34']这个数组,不需要保留原来的数组元素,那直接把数组作为值传入set()即可:
// 不需要JSON.stringify,直接用原数组 const data = ['123','hello','34']; // 添加merge: true确保只更新testData字段,不覆盖文档其他内容 await docRef.set({ testData: data }, { merge: true });
这样操作后,Firestore里的testData就会是标准的数组类型:["123", "hello", "34"]。
场景2:将数组中的每个元素添加到现有testData数组中(自动去重)
如果你的testData已经是一个数组,你想把['123','hello','34']里的每个元素都添加进去,并且自动避免重复元素,那可以用arrayUnion配合展开运算符:
const data = ['123','hello','34']; // 展开数组,把每个元素作为arrayUnion的参数传入 await docRef.set({ testData: firestore.FieldValue.arrayUnion(...data) }, { merge: true });
这样操作后,testData数组会新增这三个元素(如果之前不存在的话),比如原来的testData是["abc"],操作后就会变成["abc", "123", "hello", "34"]。
为什么你的原代码不行?
你用JSON.stringify(['123','hello','34'])得到的是字符串"['123','hello','34']",不管你把它传给arrayUnion还是直接设置为字段值,Firestore都会把它当成一个单个字符串元素来处理,自然就存成字符串类型了。记住,Firestore可以直接识别并存储JavaScript数组,不需要额外转换哦!
内容的提问来源于stack exchange,提问作者Mysterious_android
相关产品推荐
相关产品推荐

