Firebase 云函数 firestore 数组联合
Firebase cloud function firestore array union
我无法让数组并集或增量在 firebase 云函数中正常工作。
return docRef.update({
object: {
count: admin.firestore.FieldValue.increment(1),
list: admin.firestore.FieldValue.arrayUnion({
space_id: newData.date_id,
user: {
displayName: "john doe"
}
})
}
函数运行时,它只是简单地覆盖list数组中已有的数据,即使当前存在并且是数字类型,计数也始终设置为1。
根据您的评论,下面是我试过的 HTML 代码。 请注意,它不是 Cloud Function 代码(使用 Admin SDK),而是一些使用 JavaScript SDK 的 JavaScript 代码。 但很可能 Admin SDK 具有相同的行为。
按如下方式尝试:
- 在 Firestore 中创建一个集合
testSO
和一个具有 ID doc1
和一个虚拟字段的文档。
- 将此 HTML 页面保存在您的计算机上并在浏览器中打开。
- 然后更改值并在浏览器中重新加载页面以试验行为
您会看到 arrayUnion
和 increment
在与 arrayUnion
的字符串数组(字段 array1
)和 [=14 的数字一起使用时都有效=](字段 count1
)但不包含复合对象。
<!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>
您可以使用带有 id 的对象列表作为键,然后使用 id 引用更新:
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"
}
}
}
})
我无法让数组并集或增量在 firebase 云函数中正常工作。
return docRef.update({
object: {
count: admin.firestore.FieldValue.increment(1),
list: admin.firestore.FieldValue.arrayUnion({
space_id: newData.date_id,
user: {
displayName: "john doe"
}
})
}
函数运行时,它只是简单地覆盖list数组中已有的数据,即使当前存在并且是数字类型,计数也始终设置为1。
根据您的评论,下面是我试过的 HTML 代码。 请注意,它不是 Cloud Function 代码(使用 Admin SDK),而是一些使用 JavaScript SDK 的 JavaScript 代码。 但很可能 Admin SDK 具有相同的行为。
按如下方式尝试:
- 在 Firestore 中创建一个集合
testSO
和一个具有 IDdoc1
和一个虚拟字段的文档。 - 将此 HTML 页面保存在您的计算机上并在浏览器中打开。
- 然后更改值并在浏览器中重新加载页面以试验行为
您会看到 arrayUnion
和 increment
在与 arrayUnion
的字符串数组(字段 array1
)和 [=14 的数字一起使用时都有效=](字段 count1
)但不包含复合对象。
<!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>
您可以使用带有 id 的对象列表作为键,然后使用 id 引用更新: 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"
}
}
}
})