首页 > 解决方案 > 将嵌套对象数组添加到 Firestore

问题描述

我有一个名为 Pages 的数组。我的应用程序允许用户将页面对象添加到页面数组。然后将数据发送到 Firestore。我尝试使用 For 循环遍历数组中的每个对象并将其发送到 Firestore,但它似乎不起作用。我究竟做错了什么?

(我使用 Mobx 而不是 state 来存储信息,这就是为什么我没有在任何地方提到 this.state)

     let id = Math.floor(Math.random() * 10000);
     let docTitle = this.projectTitle.title;

     for(let i = 0; i > this.pages.length; i++){

     let pageT = this.pages[i].pageTitle;
     let pageD = this.pages[i].pageDesc;

     db.collection(docTitle + id).doc(pageT).set({
         page: {pageTitle:pageT, pageDesc: pageD, blocks:['item', 'item'], id:'' }
       })
       .then(function() {
         console.log("Document successfully written!");
       })
       .catch(function(error) {
         console.error("Error writing document: ", error);
       });

     }

标签: reactjsfirebasegoogle-cloud-firestore

解决方案


使用(数组长度)更多的写操作forEach为每个数组值创建请求是低效的。n(更不用说await在每次写入时使用的时间)。

我正在使用 NodeJS/Javascript,所以这也应该在 React 中工作,但可能需要稍作修改,关键是...getSearchSubstrings返回一个数组):

db.collection(x).doc(y).update({
   accountSearch: admin.firestore.FieldValue.arrayUnion(...getSearchSubstrings(username))
})

根据他们在数组文档中的更新元素,有两种方法:

// To add or remove multiple items, pass multiple arguments to arrayUnion/arrayRemove
const multipleUnionRes = await washingtonRef.update({
  regions: admin.firestore.FieldValue.arrayUnion('south_carolina', 'texas')
  // Alternatively, you can use spread operator in ES6 syntax
  // const newRegions = ['south_carolina', 'texas']
  // regions: admin.firestore.FieldValue.arrayUnion(...newRegions)
});

推荐阅读