質問編集履歴

7

日本語を修正

2020/03/04 02:28

投稿

wine
wine

スコア18

test CHANGED
File without changes
test CHANGED
@@ -198,6 +198,6 @@
198
198
 
199
199
 
200
200
 
201
- どうしてもできない場合、fruitTypesの配列をBoxに持たせようと思っていますが、ドキュメント内でデータが重複するので、できれば避けたいところです。
201
+ どうしてもできない場合、fruitType配列をBoxに持たせようと思っていますが、ドキュメント内でデータが重複するので、できれば避けたいところです。
202
202
 
203
203
  よろしくお願いいたします。

6

日本語修正

2020/03/04 02:28

投稿

wine
wine

スコア18

test CHANGED
File without changes
test CHANGED
@@ -64,7 +64,13 @@
64
64
 
65
65
  上記は簡易的な例で、実際のアプリはもっと複雑なのですが、公開ができないので、テストアプリを作りました。
66
66
 
67
+ firestoreのスクショ
68
+
69
+ ![firestoreの様子](5899341925f9accc51bfaa0b1a4eec21.png)
70
+
71
+
72
+
67
- (コードが雑なのはご容赦ください)
73
+ テストアプリのViewController(コードが雑なのはご容赦ください)
68
74
 
69
75
  ```swift
70
76
 
@@ -190,8 +196,6 @@
190
196
 
191
197
  ```
192
198
 
193
- ![firestoreの様子](5899341925f9accc51bfaa0b1a4eec21.png)
194
-
195
199
 
196
200
 
197
201
  どうしてもできない場合、fruitTypesの配列をBoxに持たせようと思っていますが、ドキュメント内でデータが重複するので、できれば避けたいところです。

5

テストアプリの追記

2020/03/04 02:27

投稿

wine
wine

スコア18

test CHANGED
@@ -1 +1 @@
1
- Firestoreを構造体配列内の値で検索する方法
1
+ Firestoreを配列内の構造体の値で検索する方法
test CHANGED
@@ -44,10 +44,156 @@
44
44
 
45
45
  DB.collection("boxes").whereField("fruits.`${index}`.type", isEqualTo: "みかん").getDocuments()
46
46
 
47
+ DB.collection("boxes").whereField("fruits", arrayContains: "type.みかん").getDocuments()
48
+
47
49
  ```
48
50
 
49
- 3つともクエリを打ち、URLでインデックスを作成し、再度クエリを打ったのですが、結果は空のドキュメント配列でした。
51
+ 4つともクエリを打ち、URLでインデックスを作成し、再度クエリを打ったのですが、結果は空のドキュメント配列でした。
50
52
 
51
53
 
52
54
 
53
55
  よろしくお願いいたします。
56
+
57
+
58
+
59
+
60
+
61
+
62
+
63
+ ## 追記
64
+
65
+ 上記は簡易的な例で、実際のアプリはもっと複雑なのですが、公開ができないので、テストアプリを作りました。
66
+
67
+ (コードが雑なのはご容赦ください)
68
+
69
+ ```swift
70
+
71
+ import UIKit
72
+
73
+ import Firebase
74
+
75
+
76
+
77
+ class ViewController: UIViewController {
78
+
79
+
80
+
81
+ let DB = Firestore.firestore()
82
+
83
+
84
+
85
+ override func viewDidLoad() {
86
+
87
+ super.viewDidLoad()
88
+
89
+
90
+
91
+ let b = UIButton(frame: CGRect(x: 100, y: 200, width: 100, height: 50))
92
+
93
+ b.backgroundColor = .red
94
+
95
+ view.addSubview(b)
96
+
97
+ b.addTarget(self, action: #selector(tapRed), for: .touchUpInside)
98
+
99
+
100
+
101
+ let b2 = UIButton(frame: CGRect(x: 100, y: 300, width: 100, height: 50))
102
+
103
+ b2.backgroundColor = .blue
104
+
105
+ view.addSubview(b2)
106
+
107
+ b2.addTarget(self, action: #selector(tapBlue), for: .touchUpInside)
108
+
109
+ }
110
+
111
+
112
+
113
+ @objc func tapRed() {
114
+
115
+ let b = Box(name: "はこ1", fruits: [Fruit(type: "mikan"), Fruit(type: "apple")]).encoded()
116
+
117
+ let r = DB.collection("boxes").document("b1")
118
+
119
+ r.setData(b, completion: nil)
120
+
121
+
122
+
123
+ let b2 = Box(name: "はこ2", fruits: [Fruit(type: "apple")]).encoded()
124
+
125
+ let r2 = DB.collection("boxes").document("b2")
126
+
127
+ r2.setData(b2, completion: nil)
128
+
129
+
130
+
131
+ let b3 = Box(name: "はこ3", fruits: [Fruit(type: "mikan")]).encoded()
132
+
133
+ let r3 = DB.collection("boxes").document("b3")
134
+
135
+ r3.setData(b3, completion: nil)
136
+
137
+ }
138
+
139
+
140
+
141
+ @objc func tapBlue() {
142
+
143
+ // みかんの入った箱(b1とb3)だけ取りたい
144
+
145
+ let r = DB.collection("boxes").whereField("fruits", arrayContains: "type.mikan")
146
+
147
+ r.getDocuments() { (snap, error) in
148
+
149
+ print("結果", snap?.documents, error)
150
+
151
+ }
152
+
153
+ }
154
+
155
+ }
156
+
157
+
158
+
159
+ struct Box {
160
+
161
+ let name: String
162
+
163
+ let fruits: [Fruit]
164
+
165
+
166
+
167
+ func encoded() -> [String:Any] {
168
+
169
+ let fs = fruits.map({$0.encoded()})
170
+
171
+ return ["name": name, "fruits": fs]
172
+
173
+ }
174
+
175
+ }
176
+
177
+
178
+
179
+ struct Fruit {
180
+
181
+ let type: String
182
+
183
+ func encoded() -> [String:Any] {
184
+
185
+ return ["type": type]
186
+
187
+ }
188
+
189
+ }
190
+
191
+ ```
192
+
193
+ ![firestoreの様子](5899341925f9accc51bfaa0b1a4eec21.png)
194
+
195
+
196
+
197
+ どうしてもできない場合、fruitTypesの配列をBoxに持たせようと思っていますが、ドキュメント内でデータが重複するので、できれば避けたいところです。
198
+
199
+ よろしくお願いいたします。

4

追記

2020/03/04 02:22

投稿

wine
wine

スコア18

test CHANGED
File without changes
test CHANGED
@@ -36,11 +36,13 @@
36
36
 
37
37
  ```swift
38
38
 
39
- DB.collection("boxes").whereField("fruits.type", arrayContains: "みかん")
39
+ let DB = Firestore.firestore()
40
40
 
41
- DB.collection("boxes").whereField("fruits.type", isEqualTo: "みかん")
41
+ DB.collection("boxes").whereField("fruits.type", arrayContains: "みかん").getDocuments()
42
42
 
43
+ DB.collection("boxes").whereField("fruits.type", isEqualTo: "みかん").getDocuments()
44
+
43
- DB.collection("boxes").whereField("fruits.`${index}`.type", isEqualTo: "みかん")
45
+ DB.collection("boxes").whereField("fruits.`${index}`.type", isEqualTo: "みかん").getDocuments()
44
46
 
45
47
  ```
46
48
 

3

追記

2020/03/03 03:22

投稿

wine
wine

スコア18

test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,5 @@
1
+ ### 前提・実現したいこと
2
+
1
3
  ``` swift
2
4
 
3
5
  struct Box {
@@ -12,7 +14,7 @@
12
14
 
13
15
  struct Fruit {
14
16
 
15
- let type: String // "みかん" とか入る
17
+ let type: String // "みかん" "りんご" など
16
18
 
17
19
  // 以下略
18
20
 
@@ -20,15 +22,17 @@
20
22
 
21
23
  ```
22
24
 
23
- 上のようなドキュメントのコレクションboxesを作成しました。
25
+
24
26
 
27
+ 上のような構造体Boxが入ったドキュメントのコレクションboxesを作成しました。
28
+
25
- タイプが"みかん"のフルーツを含むBoxを取得したいのですが、うまくいきません。
29
+ タイプが"みかん"のフルーツを含むBoxのリストを取得したいのですが、うまくいきません。
26
30
 
27
31
 
28
32
 
29
33
 
30
34
 
31
- 試したこと
35
+ ### 試したこと
32
36
 
33
37
  ```swift
34
38
 

2

試したことを追加

2020/03/03 03:15

投稿

wine
wine

スコア18

test CHANGED
File without changes
test CHANGED
@@ -36,9 +36,11 @@
36
36
 
37
37
  DB.collection("boxes").whereField("fruits.type", isEqualTo: "みかん")
38
38
 
39
+ DB.collection("boxes").whereField("fruits.`${index}`.type", isEqualTo: "みかん")
40
+
39
41
  ```
40
42
 
41
- 2つともクエリを打ち、URLでインデックスを作成し、再度クエリを打ったのですが、結果は空のドキュメント配列でした。
43
+ 3つともクエリを打ち、URLでインデックスを作成し、再度クエリを打ったのですが、結果は空のドキュメント配列でした。
42
44
 
43
45
 
44
46
 

1

試したこと追加

2020/03/02 13:47

投稿

wine
wine

スコア18

test CHANGED
File without changes
test CHANGED
@@ -34,9 +34,11 @@
34
34
 
35
35
  DB.collection("boxes").whereField("fruits.type", arrayContains: "みかん")
36
36
 
37
+ DB.collection("boxes").whereField("fruits.type", isEqualTo: "みかん")
38
+
37
39
  ```
38
40
 
39
- このクエリを打ち、URLでインデックスを作成し、再度クエリを打ったのですが、結果は空のドキュメント配列でした。
41
+ 2つともクエリを打ち、URLでインデックスを作成し、再度クエリを打ったのですが、結果は空のドキュメント配列でした。
40
42
 
41
43
 
42
44