teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

7

日本語を修正

2020/03/04 02:28

投稿

wine
wine

スコア18

title CHANGED
File without changes
body CHANGED
@@ -98,5 +98,5 @@
98
98
  }
99
99
  ```
100
100
 
101
- どうしてもできない場合、fruitTypesの配列をBoxに持たせようと思っていますが、ドキュメント内でデータが重複するので、できれば避けたいところです。
101
+ どうしてもできない場合、fruitType配列をBoxに持たせようと思っていますが、ドキュメント内でデータが重複するので、できれば避けたいところです。
102
102
  よろしくお願いいたします。

6

日本語修正

2020/03/04 02:28

投稿

wine
wine

スコア18

title CHANGED
File without changes
body CHANGED
@@ -31,7 +31,10 @@
31
31
 
32
32
  ## 追記
33
33
  上記は簡易的な例で、実際のアプリはもっと複雑なのですが、公開ができないので、テストアプリを作りました。
34
+ firestoreのスクショ
35
+ ![firestoreの様子](5899341925f9accc51bfaa0b1a4eec21.png)
36
+
34
- (コードが雑なのはご容赦ください)
37
+ テストアプリのViewController(コードが雑なのはご容赦ください)
35
38
  ```swift
36
39
  import UIKit
37
40
  import Firebase
@@ -94,7 +97,6 @@
94
97
  }
95
98
  }
96
99
  ```
97
- ![firestoreの様子](5899341925f9accc51bfaa0b1a4eec21.png)
98
100
 
99
101
  どうしてもできない場合、fruitTypesの配列をBoxに持たせようと思っていますが、ドキュメント内でデータが重複するので、できれば避けたいところです。
100
102
  よろしくお願いいたします。

5

テストアプリの追記

2020/03/04 02:27

投稿

wine
wine

スコア18

title CHANGED
@@ -1,1 +1,1 @@
1
- Firestoreを構造体配列内の値で検索する方法
1
+ Firestoreを配列内の構造体の値で検索する方法
body CHANGED
@@ -21,7 +21,80 @@
21
21
  DB.collection("boxes").whereField("fruits.type", arrayContains: "みかん").getDocuments()
22
22
  DB.collection("boxes").whereField("fruits.type", isEqualTo: "みかん").getDocuments()
23
23
  DB.collection("boxes").whereField("fruits.`${index}`.type", isEqualTo: "みかん").getDocuments()
24
+ DB.collection("boxes").whereField("fruits", arrayContains: "type.みかん").getDocuments()
24
25
  ```
25
- 3つともクエリを打ち、URLでインデックスを作成し、再度クエリを打ったのですが、結果は空のドキュメント配列でした。
26
+ 4つともクエリを打ち、URLでインデックスを作成し、再度クエリを打ったのですが、結果は空のドキュメント配列でした。
26
27
 
28
+ よろしくお願いいたします。
29
+
30
+
31
+
32
+ ## 追記
33
+ 上記は簡易的な例で、実際のアプリはもっと複雑なのですが、公開ができないので、テストアプリを作りました。
34
+ (コードが雑なのはご容赦ください)
35
+ ```swift
36
+ import UIKit
37
+ import Firebase
38
+
39
+ class ViewController: UIViewController {
40
+
41
+ let DB = Firestore.firestore()
42
+
43
+ override func viewDidLoad() {
44
+ super.viewDidLoad()
45
+
46
+ let b = UIButton(frame: CGRect(x: 100, y: 200, width: 100, height: 50))
47
+ b.backgroundColor = .red
48
+ view.addSubview(b)
49
+ b.addTarget(self, action: #selector(tapRed), for: .touchUpInside)
50
+
51
+ let b2 = UIButton(frame: CGRect(x: 100, y: 300, width: 100, height: 50))
52
+ b2.backgroundColor = .blue
53
+ view.addSubview(b2)
54
+ b2.addTarget(self, action: #selector(tapBlue), for: .touchUpInside)
55
+ }
56
+
57
+ @objc func tapRed() {
58
+ let b = Box(name: "はこ1", fruits: [Fruit(type: "mikan"), Fruit(type: "apple")]).encoded()
59
+ let r = DB.collection("boxes").document("b1")
60
+ r.setData(b, completion: nil)
61
+
62
+ let b2 = Box(name: "はこ2", fruits: [Fruit(type: "apple")]).encoded()
63
+ let r2 = DB.collection("boxes").document("b2")
64
+ r2.setData(b2, completion: nil)
65
+
66
+ let b3 = Box(name: "はこ3", fruits: [Fruit(type: "mikan")]).encoded()
67
+ let r3 = DB.collection("boxes").document("b3")
68
+ r3.setData(b3, completion: nil)
69
+ }
70
+
71
+ @objc func tapBlue() {
72
+ // みかんの入った箱(b1とb3)だけ取りたい
73
+ let r = DB.collection("boxes").whereField("fruits", arrayContains: "type.mikan")
74
+ r.getDocuments() { (snap, error) in
75
+ print("結果", snap?.documents, error)
76
+ }
77
+ }
78
+ }
79
+
80
+ struct Box {
81
+ let name: String
82
+ let fruits: [Fruit]
83
+
84
+ func encoded() -> [String:Any] {
85
+ let fs = fruits.map({$0.encoded()})
86
+ return ["name": name, "fruits": fs]
87
+ }
88
+ }
89
+
90
+ struct Fruit {
91
+ let type: String
92
+ func encoded() -> [String:Any] {
93
+ return ["type": type]
94
+ }
95
+ }
96
+ ```
97
+ ![firestoreの様子](5899341925f9accc51bfaa0b1a4eec21.png)
98
+
99
+ どうしてもできない場合、fruitTypesの配列をBoxに持たせようと思っていますが、ドキュメント内でデータが重複するので、できれば避けたいところです。
27
100
  よろしくお願いいたします。

4

追記

2020/03/04 02:22

投稿

wine
wine

スコア18

title CHANGED
File without changes
body CHANGED
@@ -17,9 +17,10 @@
17
17
 
18
18
  ### 試したこと
19
19
  ```swift
20
+ let DB = Firestore.firestore()
20
- DB.collection("boxes").whereField("fruits.type", arrayContains: "みかん")
21
+ DB.collection("boxes").whereField("fruits.type", arrayContains: "みかん").getDocuments()
21
- DB.collection("boxes").whereField("fruits.type", isEqualTo: "みかん")
22
+ DB.collection("boxes").whereField("fruits.type", isEqualTo: "みかん").getDocuments()
22
- DB.collection("boxes").whereField("fruits.`${index}`.type", isEqualTo: "みかん")
23
+ DB.collection("boxes").whereField("fruits.`${index}`.type", isEqualTo: "みかん").getDocuments()
23
24
  ```
24
25
  3つともクエリを打ち、URLでインデックスを作成し、再度クエリを打ったのですが、結果は空のドキュメント配列でした。
25
26
 

3

追記

2020/03/03 03:22

投稿

wine
wine

スコア18

title CHANGED
File without changes
body CHANGED
@@ -1,3 +1,4 @@
1
+ ### 前提・実現したいこと
1
2
  ``` swift
2
3
  struct Box {
3
4
  let fruits: [Fruit]
@@ -5,15 +6,16 @@
5
6
  }
6
7
 
7
8
  struct Fruit {
8
- let type: String // "みかん" とか入る
9
+ let type: String // "みかん" "りんご" など
9
10
  // 以下略
10
11
  }
11
12
  ```
13
+
12
- 上のようなドキュメントのコレクションboxesを作成しました。
14
+ 上のような構造体Boxが入ったドキュメントのコレクションboxesを作成しました。
13
- タイプが"みかん"のフルーツを含むBoxを取得したいのですが、うまくいきません。
15
+ タイプが"みかん"のフルーツを含むBoxのリストを取得したいのですが、うまくいきません。
14
16
 
15
17
 
16
- 試したこと
18
+ ### 試したこと
17
19
  ```swift
18
20
  DB.collection("boxes").whereField("fruits.type", arrayContains: "みかん")
19
21
  DB.collection("boxes").whereField("fruits.type", isEqualTo: "みかん")

2

試したことを追加

2020/03/03 03:15

投稿

wine
wine

スコア18

title CHANGED
File without changes
body CHANGED
@@ -17,7 +17,8 @@
17
17
  ```swift
18
18
  DB.collection("boxes").whereField("fruits.type", arrayContains: "みかん")
19
19
  DB.collection("boxes").whereField("fruits.type", isEqualTo: "みかん")
20
+ DB.collection("boxes").whereField("fruits.`${index}`.type", isEqualTo: "みかん")
20
21
  ```
21
- 2つともクエリを打ち、URLでインデックスを作成し、再度クエリを打ったのですが、結果は空のドキュメント配列でした。
22
+ 3つともクエリを打ち、URLでインデックスを作成し、再度クエリを打ったのですが、結果は空のドキュメント配列でした。
22
23
 
23
24
  よろしくお願いいたします。

1

試したこと追加

2020/03/02 13:47

投稿

wine
wine

スコア18

title CHANGED
File without changes
body CHANGED
@@ -16,7 +16,8 @@
16
16
  試したこと
17
17
  ```swift
18
18
  DB.collection("boxes").whereField("fruits.type", arrayContains: "みかん")
19
+ DB.collection("boxes").whereField("fruits.type", isEqualTo: "みかん")
19
20
  ```
20
- このクエリを打ち、URLでインデックスを作成し、再度クエリを打ったのですが、結果は空のドキュメント配列でした。
21
+ 2つともクエリを打ち、URLでインデックスを作成し、再度クエリを打ったのですが、結果は空のドキュメント配列でした。
21
22
 
22
23
  よろしくお願いいたします。