【Firastore】ドキュメントの下に登録した配列 オブジェクトの値を追加、削除する(Swift)

Firebase

やりたいこと

「コレクション名 -> ドキュメント名 -> 配列名 -> データ」のような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"
        ]      
      ]
    }
  }
}

終わりに

最後まで読んでいただきありがとうございました。何か少しでも読者の皆さんの力になれたら幸いです。また機会があればぜひきてください!!

プロフィール

SIer勤めのエンジニア
アプリケーションエンジニアとして、WebやiOSなどのアプリ開発をメインにしてます

tomaをフォローする
FirebaseSwift