在 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 一样。

在提出解决方案之前,让我指出两点:

  1. 如果使用 update,则不需要 {merge: true}。如果文档已经存在,您可以将 {merge: true}set 一起使用以获得类似更新的行为。
  2. 我不会使用 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)。