【问题标题】:Firebase - query a property of an object with an specific and non-specific valueFirebase - 查询具有特定和非特定值的对象的属性
【发布时间】:2021-10-07 20:49:02
【问题描述】:

我正在对一个结构如下的小型数据库运行基本查询:

  • 汽车制造商:
  • 车型:
  • 汽车颜色:

假设前 2 个字段具有特定信息:

  • 汽车制造商:“福特”
  • 汽车型号:“野马”

但是对于第三个字段,我可以查询所有具有特定颜色的值:红色、蓝色等。我的问题是如何使用以下方法查询第三个字段:

  • carColor:“所有颜色”

如果“所有颜色”不是特定值?我使用过: .whereField(CAR_COLOR, isGreaterThanOrEqualTo or arrayContains or arrayContainsAny, etc) 但它不起作用。我没有得到任何结果。有任何想法吗?谢谢!

【问题讨论】:

  • 如果您希望它返回所有内容而不管该字段中的颜色是什么,为什么要使用 whereField 查询?
  • carColor 字段是为最终用户提供一个选项,如果他们想要过滤到特定颜色(红色、蓝色等),或者他们想要查看所有内容而不管他们可以使用的颜色如何“所有颜色”
  • 好的。所以,如果他们选择“所有颜色”,那么我很难理解为什么在这种情况下你会在 carColor 上使用 whereField
  • “所有颜色”未分配给任何 carColor 对象。我使用 whereField 以便用户可以过滤到特定的颜色。那么让我问你这个问题,如果在查询中我选择“所有颜色”,是否可以绕过 carColor 字段?但是如果查询有特定颜色“红色”,不要绕过并运行它?
  • 最简单的,你可以使用if { } else { } 来运行不同的查询。但是,如果您想使用相同的查询链,我在下面添加了一个答案,允许您使用条件 whereField 查询。如果您不想想要运行查询,您可能希望将false 传递给useCondition

标签: swift google-cloud-firestore


【解决方案1】:

根据 cmets 的讨论,听起来您希望能够在查询链中包含 whereField,但如果某些条件为真/假,则不实际执行它。

我建议给Query添加一个扩展:

extension Query {
    func whereField(useCondition: Bool, _ field: String, arrayContains: String) -> Query {
        if useCondition {
            return self.whereField(field, arrayContains: arrayContains)
        } else {
            return self
        }
    }
}

然后,你可以这样做:

db.collection("car").whereField(useCondition: !allColors, "carColor", arrayContains: searchedColor)

请注意,您可能需要调整它以适应您需要的各种whereField

【讨论】:

    猜你喜欢
    • 2014-02-11
    • 1970-01-01
    • 2021-05-19
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多