如何在Firebase Firestore中推送数组值

时间:2018-04-19 08:05:56

标签: javascript firebase google-cloud-firestore

我正在尝试推送一个数组元素但是正在销毁那里的所有内容并用推送的数据替换:

db .collection('households')
  .doc(householdId)
  .set( { users: [uid], }, { merge: true }, )
  .then(() => { resolve(); })
  .catch(() => reject());

我认为合并真实并不会破坏已存在的数据吗?在firestore api docs上苦苦挣扎。

这是我的数据结构:

households
  2435djgnfk 
    users [ 
      0: user1 
      1: user2 
    ]

谢谢!

3 个答案:

答案 0 :(得分:3)

我认为现在您可以通过使用 FieldValue.arrayUnion 使用文档上的 update 命令来做得更好,而不会破坏同时添加的数据。像这样:

const admin = require('firebase-admin');
let db = admin.firestore();
const FieldValue = admin.firestore.FieldValue;
let collectionRef = db.collection(collection);
let ref = collectionRef.doc(id);

let setWithOptions = ref.update(arrayFieldName, FieldValue.arrayUnion(value));

in progress

中所述

答案 1 :(得分:0)

您应该使用Firestore Transaction

const householdRef = db.collection('households').doc(householdId);

const newUid = '1234'; // whatever the uid is...

return db.runTransaction((t) => {
  return t.get(householdRef).then((doc) => {
    // doc doesn't exist; can't update
    if (!doc.exists) return;
    // update the users array after getting it from Firestore.
    const newUserArray = doc.get('users').push(newUid);
    t.set(householdRef, { users: newUserArray }, { merge: true });
  });
}).catch(console.log);

更新数组或存储对象而不先获取它将始终销毁firestore中该数组/对象内的旧值。

这是因为它们是字段而不是实际文档本身。因此,您必须首先获取文档,然后在此之后更新该值。

答案 2 :(得分:0)

Firestore中的数组不会像这样工作。根据{{​​3}}:

  

虽然Cloud Firestore可以存储数组,但它不支持查询数组成员或更新单个数组元素。

如果要更改数组中的任何元素,必须首先从文档中读取数组值,在客户端中对其进行更改,然后将整个数组写回。

可能还有其他方法可以为您的用例建立更好的数据模型。上面链接的那一页文档有一些解决方案。