在 Firestore 中更新查询
Updating Query in Firestore
我是 Firestore 的新手,需要一些有关 Firestore 更新的帮助。
我有以下结构,想更新 "employee name" 属性。不确定如何 select 和更新。
Department:[
Name: Accounts
Employee:[
{Name :David,
Age :25},
{Name:Paul,
Age:27}
]
]
这是我试图做的事情:
let depempCollectionRef = admin.firestore().collection('DepEmployee').doc('depempid')
depempCollectionRef.Department.Employee
.update({ name: 'Scott' },{merge:true})
.then(function() { console.log("Document successfully updated!"); })
Employee
只是您的 Firestore 文档中的嵌入式数据结构——因此您无法通过引用直接对其进行寻址。就 Firestore 而言,Employee
只是 Department
文档中的一个属性,就像 Name
一样。
在提出解决方案之前,让我指出两点:
- 如果使用
update
,则不需要 {merge: true}
。如果文档已经存在,您可以将 {merge: true}
与 set
一起使用以获得类似更新的行为。
- 我不会使用
Array
名员工。将员工存储在 Firestore 中他们自己的集合中,然后只在此处列出他们的引用 ID(= 外键)可能更有意义。作为一般经验法则:尽量保持数据结构平坦。如果您需要保持项目的特定顺序,也仅使用 Arrays
。
A) 如果您有一个单独的员工集合,更新名称非常简单:
employeeCollection.doc('101').update({name: 'Scott'})
B) 如果您想在部门文档中存储员工数据,我仍然会将它们存储为带有 ID 的地图(而不是 Array
)并且然后使用点符号访问它们:
Department:[
Name: Accounts
Employees:{
101: {
Name :David,
Age :25
},
102: {
Name:Paul,
Age:27
}
}
]
depempCollectionRef.Department
.set({ ['101.name']: 'Scott' }, {merge:true})
C) 而如果你真的想存储嵌入在一个Array
中的数据,我相信你必须阅读并更新整个Array
(不确定,有没有更好的解决办法):
const employeesSnap = await depempCollectionRef.Department.get()
const updatedEmployees = changeNameOfScottInArray()
depempCollectionRef.Department
.update({ 'Employees': updatedEmployees })
我没有测试这段代码,但我希望你能理解它的要点!
我建议您通过创建一个单独的 Employee
集合来扁平化您的数据结构,然后仅通过您所在部门的外键引用它们(解决方案 A)。
我是 Firestore 的新手,需要一些有关 Firestore 更新的帮助。
我有以下结构,想更新 "employee name" 属性。不确定如何 select 和更新。
Department:[
Name: Accounts
Employee:[
{Name :David,
Age :25},
{Name:Paul,
Age:27}
]
]
这是我试图做的事情:
let depempCollectionRef = admin.firestore().collection('DepEmployee').doc('depempid')
depempCollectionRef.Department.Employee
.update({ name: 'Scott' },{merge:true})
.then(function() { console.log("Document successfully updated!"); })
Employee
只是您的 Firestore 文档中的嵌入式数据结构——因此您无法通过引用直接对其进行寻址。就 Firestore 而言,Employee
只是 Department
文档中的一个属性,就像 Name
一样。
在提出解决方案之前,让我指出两点:
- 如果使用
update
,则不需要{merge: true}
。如果文档已经存在,您可以将{merge: true}
与set
一起使用以获得类似更新的行为。 - 我不会使用
Array
名员工。将员工存储在 Firestore 中他们自己的集合中,然后只在此处列出他们的引用 ID(= 外键)可能更有意义。作为一般经验法则:尽量保持数据结构平坦。如果您需要保持项目的特定顺序,也仅使用Arrays
。
A) 如果您有一个单独的员工集合,更新名称非常简单:
employeeCollection.doc('101').update({name: 'Scott'})
B) 如果您想在部门文档中存储员工数据,我仍然会将它们存储为带有 ID 的地图(而不是 Array
)并且然后使用点符号访问它们:
Department:[
Name: Accounts
Employees:{
101: {
Name :David,
Age :25
},
102: {
Name:Paul,
Age:27
}
}
]
depempCollectionRef.Department
.set({ ['101.name']: 'Scott' }, {merge:true})
C) 而如果你真的想存储嵌入在一个Array
中的数据,我相信你必须阅读并更新整个Array
(不确定,有没有更好的解决办法):
const employeesSnap = await depempCollectionRef.Department.get()
const updatedEmployees = changeNameOfScottInArray()
depempCollectionRef.Department
.update({ 'Employees': updatedEmployees })
我没有测试这段代码,但我希望你能理解它的要点!
我建议您通过创建一个单独的 Employee
集合来扁平化您的数据结构,然后仅通过您所在部门的外键引用它们(解决方案 A)。