No momento, estou testando o Firestore e estou preso em algo muito simples: "atualizar uma matriz (também conhecida como subdocumento)".
Minha estrutura de banco de dados é super simples. Por exemplo:
proprietary: "John Doe",
sharedWith:
[
{who: "[email protected]", when:timestamp},
{who: "[email protected]", when:timestamp},
],
Estou tentando (sem sucesso) inserir novos registros em uma shareWith
matriz de objetos.
Eu tentei:
// With SET
firebase.firestore()
.collection('proprietary')
.doc(docID)
.set(
{ sharedWith: [{ who: "[email protected]", when: new Date() }] },
{ merge: true }
)
// With UPDATE
firebase.firestore()
.collection('proprietary')
.doc(docID)
.update({ sharedWith: [{ who: "[email protected]", when: new Date() }] })
Nenhum funciona. Essas consultas sobrescrevem meu array.
A resposta pode ser simples, mas não consegui encontrar ...
fonte
arrayUnion
método.O Firestore agora tem duas funções que permitem atualizar um array sem reescrever tudo.
Link: https://firebase.google.com/docs/firestore/manage-data/add-data , especificamente https://firebase.google.com/docs/firestore/manage-data/add-data#update_elements_in_an_array
fonte
Você pode usar uma transação ( https://firebase.google.com/docs/firestore/manage-data/transactions ) para obter o array, enviar para ele e, em seguida, atualizar o documento:
fonte
documentReference
adduserRef
como mostrado:transaction.set(userRef, { bookings: [booking] });
Aqui está o exemplo mais recente da documentação do Firestore:
firebase.firestore.FieldValue. ArrayUnion
fonte
Desculpe, atrasado para a festa, mas o Firestore resolveu isso em agosto de 2018, então, se você ainda está procurando por isso, aqui estão todos os problemas resolvidos em relação aos arrays.
https://firebase.googleblog.com/2018/08/better-arrays-in-cloud-firestore.html Postagem oficial do blog
array-contains, arrayRemove, arrayUnion para verificar, remover e atualizar arrays. Espero que ajude.
fonte
Para desenvolver a resposta de Sam Stern , há também uma terceira opção que tornou as coisas mais fáceis para mim: usar o que o Google chama de mapa, que é essencialmente um dicionário.
Acho que um dicionário é muito melhor para o caso de uso que você está descrevendo. Eu normalmente uso arrays para coisas que não são muito atualizadas, então eles são mais ou menos estáticos. Mas para coisas que são muito gravadas, especificamente valores que precisam ser atualizados para campos que estão vinculados a alguma outra coisa no banco de dados, os dicionários são muito mais fáceis de manter e trabalhar.
Portanto, para seu caso específico, a estrutura do banco de dados seria assim:
Isso permitirá que você faça o seguinte:
A razão para definir o objeto como uma variável é que usar
'sharedWith.' + whoEmail + '.when'
diretamente no método set resultará em um erro, pelo menos ao usá-lo em uma função de nuvem Node.js.fonte
Além das respostas mencionadas acima. Isso vai bastar. Usando Angular 5 e AngularFire2. ou use firebase.firestore () em vez de this.afs
fonte
Considere John Doe um documento em vez de uma coleção
Dê a ele uma coleção de coisas compartilhadas com outras pessoas
Em seguida, você pode mapear e consultar as coisas compartilhadas de John Doe nessa coleção paralela das coisas compartilhadas com os outros.
fonte
Se alguém estiver procurando por uma solução Java Firestore SDK para adicionar itens no campo array:
Para excluir itens do usuário da matriz:
FieldValue.arrayRemove()
fonte
}
fonte
É assim que eu fiz funcionar. Espero que ajude a todos, pois vejo isso como uma solução muito melhor. Aqui, desejo alterar o status da tarefa de aberta (fechar = falso) para fechar (fechar = verdadeiro), mantendo todo o resto igual no objeto.
e aqui está o serviço que realmente o atualiza
fonte