やりたいこと
「コレクション名 -> ドキュメント名 -> 配列名 -> データ」のような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"
]
]
}
}
}
終わりに
最後まで読んでいただきありがとうございました。何か少しでも読者の皆さんの力になれたら幸いです。また機会があればぜひきてください!!