>

다음과 같은 간단한 컬렉션이있는 경우 :

Fruits:
  Banana:
   title: "Banana"
   vitamins: ["potassium","B6","C"]
  Apple:
   title: "Apple"
   vitamins: ["A","B6","C"]

비타민 B6가 포함 된 과일을 검색하려면 다음을 수행하십시오.

db.collection("Fruits").whereField("vitamins", arrayContains: "A").getDocuments() { (querySnapshot, err)  in
        if let err = err {
            print("Error getting documents: \(err)")
        } else {
            for document in querySnapshot!.documents {
                print("\(document.documentID) => \(document.data())")
            }
        }
    }

그러면 비타민 A가 포함 된 컬렉션의 모든 과일이 나에게 표시됩니다. 그러나 비타민 B6 및 C와 같이 여러 비타민이 포함 된 과일을 어떻게 검색 할 수 있습니까? 나는 단순히 ["B6","C"] 를 검색 할 수 없습니다  독립 문자열이 아닌 배열을 찾고 있기 때문입니다.

Cloud Firestore에서도 가능합니까? 그렇지 않으면 다른 방법이 있습니까?


  • 답변 # 1

    쿼리에 조건을 연결하여 여러 조건과 일치하는 문서를 찾으려고합니다.

    db.collection("Fruits")
        .whereField("vitamins", arrayContains: "B6")
        .whereField("vitamins", arrayContains: "C")
    
    

    그러나 복합 쿼리에 대한 문서는 현재 단일 쿼리에서 여러 arrayContains 조건을 가질 수 없음을 제안합니다.

    그러므로 오늘 가지고있는 것은 불가능합니다. 대신 배열 대신 맵 구조를 사용하는 것이 좋습니다 :

    Fruits:
      Banana:
       title: "Banana"
       vitamins: {
         "potassium": true,
         "B6": true,
         "C": true
       }
    
    

    다음과 같이 쿼리 할 수 ​​있습니다 :

    db.collection("Fruits")
        .whereField("vitamins.B6", isEqualTo: true)
        .whereField("vitamins.C", isEqualTo: true)
    
    

  • 답변 # 2

    Firestore에서 요청한 것처럼 여러 개의 배열이 포함 된 쿼리를 수행 할 수있는 방법이 없습니다. 그러나 많은 where 를 결합 할 수 있습니다  실제로 가능한 조건. 그러므로 이것을 고려하십시오 :

    Fruits:
        Banana:
            title: "Banana"
            vitamins:
                potassium: true
                b6: true
                c: true
    
    

    Firestore.firestore().collection("Fruits").whereField("vitamins.potassium", isEqualTo: true).whereField("vitamins.b6", isEqualTo: true)

    그러나하지 않음: 깨끗한 or 를 할 수 있습니다  그냥 and 를 검색 . 비타민 x 또는 비타민 y가 함유 된 과일을 쿼리하려면 더 창의력을 가져야합니다. 또한이 방법은 가능한 많은 값이 있고 복합 쿼리와 결합해야하는 상황에서 사용하지 않아야합니다. Firestore는 200 개 이상의 복합 지수를 허용하지 않으며 각 복합 지수는 정확한 비타민을 지정해야하기 때문입니다. 예를 들어 vitamins.b6 에 대한 개별 복합 색인을 작성해야합니다. vitamins.potassium 등 총 200 개만 있습니다.

  • 답변 # 3

    Firestore에는 둘 이상의 arrayContains 를 사용하여 Firestore 데이터베이스를 쿼리 할 수있는 방법이 없습니다. . 둘 이상을 사용하는 경우 다음과 같은 오류가 발생할 수 있습니다.

    와이즈 비즈

    하나 이상의 비타민을 필터링해야하는 경우 보유하고있는 각각의 개별 비타민에 대한 속성을 생성 한 다음

    Invalid Query. Queries only support having a single array-contains filter.

    를 체인화하여 데이터베이스를 구성하는 논리를 변경해야합니다.  함수 호출. 약간 이상하게 들리지만 Cloud Firestore의 작동 방식입니다.

    스키마는 다음과 같아야합니다 :

    .whereField()
    
    
    vitamins: { "potassium": true, "B6": true, "C": true } 와 모든 과일을 찾으려면 potassium  그리고 B6  비타민의 경우 다음과 같은 쿼리를 사용해야합니다.

    C
    
    
    let fruitsRef = db.collection("Fruits") .whereField("vitamins.potassium", isEqualTo: true) .whereField("vitamins.B6", isEqualTo: true) .whereField("vitamins.C", isEqualTo: true)

관련 자료

  • 이전 c# - Azure Service Bus에서 메시지 수신 모드가 ReceiveAndDelete 인 경우 메시지의 TTL은 무엇입니까?
  • 다음 javascript - 함수에서 값을 반환하고 다른 함수를 사용하는 방법