一尘不染

Firestore搜索数组包含多个值

swift

如果我有一个简单的集合,例如:

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中甚至有可能吗?如果没有,还有其他替代方法吗?


阅读 211

收藏
2020-07-07

共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)
2020-07-07