Reputation: 686
I'm unable to get the array union or increment to work properly in firebase cloud functions.
return docRef.update({
object: {
count: admin.firestore.FieldValue.increment(1),
list: admin.firestore.FieldValue.arrayUnion({
space_id: newData.date_id,
user: {
displayName: "john doe"
}
})
}
When the function runs, it simply overwrites the existing data in the list array and the count is always set to 1 even though it currently exists and is of number type.
Upvotes: 9
Views: 15628
Reputation: 305
You can use a list of object with id as a key, then update using the id reference: https://firebase.google.com/docs/firestore/manage-data/add-data#update_fields_in_nested_objects
docRef.update({
object: {
count: admin.firestore.FieldValue.increment(1),
`list.${user_id}`: {
space_id: newData.date_id,
user: {
user_id,
displayName: "john doe"
}
}
}
})
Upvotes: 0
Reputation: 83163
Following you comment, here is below the HTML code I tried. Note that it is not Cloud Function code (which uses the Admin SDK) but some JavaScript code using the JavaScript SDK. But most probably the Admin SDK has the same behavior.
To try it do as follows:
testSO
in Firestore and a doc with ID doc1
and one dummy field.You will see that both arrayUnion
and increment
work when used with an array of strings for arrayUnion
(field array1
) and a number for increment
(field count1
) but not with the compounded object.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Title</title>
<script src="https://www.gstatic.com/firebasejs/5.9.3/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/5.9.3/firebase-database.js"></script>
<script src="https://www.gstatic.com/firebasejs/5.9.3/firebase-auth.js"></script>
<script src="https://www.gstatic.com/firebasejs/5.9.3/firebase-functions.js"></script>
<script src="https://www.gstatic.com/firebasejs/5.9.3/firebase-firestore.js"></script>
</head>
<body>
<script>
// Initialize Firebase
var config = {
apiKey: 'xxxxxxxxxxx',
authDomain: 'xxxxxxxxxxx',
databaseURL: 'xxxxxxxxxxx',
projectId: 'xxxxxxxxxxx'
};
firebase.initializeApp(config);
var db = firebase.firestore();
db.doc('testSO/doc1').update({
count1: firebase.firestore.FieldValue.increment(1),
array1: firebase.firestore.FieldValue.arrayUnion('arrayItem'),
object: {
count: firebase.firestore.FieldValue.increment(1),
list: firebase.firestore.FieldValue.arrayUnion({
space_id: 'spaceNbr',
user: {
displayName: 'john doe'
}
})
}
});
</script>
</body>
</html>
Upvotes: 3