やりたいこと
「コレクション名 -> ドキュメント名 -> 配列名 -> データ」のような4階層の値を新規で作成し、値を追加、削除を行いたい。
{
  "コレクション": {
    "ドキュメント": {
      "配列名": [
        [
          "データ1": "data1",
          "データ2": "data2",
          ....
        ],
        [
          "データ1": "data1",
          "データ2": "data2",
          ....
        ],
        ....
      ]
    }
  }
}実装方法
新規作成
まずは新規作成方法です。基本的なコードの書き方は以下のようになります。
let db = Firestore.firestore()
let testRef = db.collection(collectionName).document(documentName).setData(
[
  "arrayName":[
    [
      "item1": item1,
      "item2": item2,
      "item3": item3,
      "item4": item4
    ]
  ]
]){ error in
  if let error = error {
    print("\(error)")
    print("データ追加失敗")
  }
}基本的には、通常のデータ追加と同様にできます。違いといえば配列形式のデータを追加するくらいです。
実際の利用例
実際の利用例は以下のようになります。
let db = Firestore.firestore()
let testRef = db.collection("test").document("00001").setData(
[
  "202504":[
    [
      "title": "ご飯",
      "amount": 2000,
      "contents":"test",
      "date":"20250401 12:00"
    ]
  ]
]){ error in
  if let error = error {
    print("\(error)")
    print("データ追加失敗")
  }
}追加されるデータ以下の様になります。
{
  "test":{
    "00001":{
      "202504":[
        [
          "title": "ご飯",
          "amount": 2000,
          "contents":"test",
          "date":"20250401 12:00"
        ]
      ]
   }  
}
追加
次にデータの追加方法です。ドキュメント内の配列を操作する、基本的なコードの書き方は以下のようになります。
let messageRef = db.collection("collectionName").document("documentsName")
        
let fieldPath = "arrayName"
let itemName = "testName"
        
let newItem:[String:Any] = [
    "itemName":itemName
]
                
messageRef.updateData([
  fieldPath: FieldValue.arrayUnion([newItem])
]){ error in
  ...//エ
}
        ポイントとしては以下の部分になってます。
...
messageRef.updateData([
  fieldPath: FieldValue.arrayUnion([newItem])
]){ error in
  .....ソースコード的には、読みづらいかもしれませんが、updateDataメソッドを利用するときに、fieldPathを指定し、FieldValue .arrayUnion()を利用することで配列に新しい要素を格納します。
これによってnewItemを既存の、arrayName以下の配列に追加してきます。
実際の利用例
Firestoreに以下のようなデータがあるとします
{
  "test":{
    "00001":{
      "202504":[
        [
          "title":"aaa",
          "amount":200,
          "date":"20250401 12:00",
          "content":"test"
        ]
      ]
    }
  }
}
    上記のデータに対して、以下のコードを実行します。
let db = Firestore.firestore()
let messageRef = db.collection("test").document("00001")
            
let fieldPath = "202504"
            
let newItem:[String:Any] = [
    "title": "夜ご飯",
    "amount": 2000,
    "contents":"test",
    "date":"20250406 17:00"
]
                    
messageRef.updateData([
  fieldPath: FieldValue.arrayUnion([newItem])
]){ error in
 if let error = error {
   print("\(error)")
 }else{
   print("データ登録に成功しました")
 }
}
処理が成功すると以下のようにデータが追加されます
{
  "test":{
    "00001":{
      "202504":[
        [
          "title":"aaa",
          "amount":200,
          "date":"20250401 12:00",
          "content":"test"
        ],
        [
          "title": "夜ご飯",
          "amount": 2000,
          "contents":"test",
          "date":"20250406 17:00"
        ]      
      ]
    }
  }
}削除
最後に削除です。配列中のデータを削除する方法を説明します
まず基本的なデータは以下のようになります。
let docRef = db.collection(collectinoName).document(documentName)
let fieldPath = "arrayName"
let itemName = "testName"
    
let targetItem: [String: Any] = [
    "itemName":itemName
]
docRef.updateData([
  fieldPath: FieldValue.arrayRemove([targetItem])
]) { error in
  if let error = error {
    print("❌ 削除失敗: \(error)")
  } else {
    print("✅ 削除成功")
  }
}
        ここでポイントですがtargetItemの値が、現在Firestoreに存在する配列の要素と全て一致している必要があります。
削除を行う箇所は以下の「fieldPath: FieldValue.arrayRemove([targetItem])」の部分です。実際の処理は、Firestoreから指定の配列要素を全て取得し、その値を更新し再度登録するという流れになります。
...
docRef.updateData([
  fieldPath: FieldValue.arrayRemove([targetItem])
]) { error in
...実際の利用例
まず、Firestoreに以下のようなデータがあるとします。
{
  "test":{
    "00001":{
      "202504":[
        [
          "title":"aaa",
          "amount":200,
          "date":"20250401 12:00",
          "content":"test"
        ],
        [
          "title": "夜ご飯",
          "amount": 2000,
          "contents":"test",
          "date":"20250406 17:00"
        ]      
      ]
    }
  }
}上記のデータに以下のコードを実行します。
let db = Firestore.firestore()
let fieldPath = "202504"
    
let targetItem  = [
  "title":"aaa",
  "amount":200,
  "date":"20250401 12:00",
  "content":"test"
] as [String : Any]
    
db.collection("test").document("00001").updateData([
    fieldPath: FieldValue.arrayRemove([targetItem])
]) { error in
   if let error = error {
       print("Error deleting field: \(error)")
   } else {
       print("Field successfully deleted!")
   }
}上記のコードが成功するとFirestoreのデータは以下のようになります。
{
  "test":{
    "00001":{
      "202504":[
        [
          "title": "夜ご飯",
          "amount": 2000,
          "contents":"test",
          "date":"20250406 17:00"
        ]      
      ]
    }
  }
}終わりに
最後まで読んでいただきありがとうございました。何か少しでも読者の皆さんの力になれたら幸いです。また機会があればぜひきてください!!
  
  
  
  