如何在Cloud Firestore中查询不存在的文档密钥

Geo*_*org 11 firebase google-cloud-firestore

假设我有一个带有一些可选属性的数据模型.这可以是例如具有"firstname","lastname"和可选的"website"属性的用户对象.

在Cloud Firestore中,只有具有已知网站的用户文档才会设置"网站"属性,对于所有其他用户文档,此属性将不存在.

我现在的问题是如何在没有 "网站"属性的情况下查询所有用户文档.

谢谢.

Gri*_*orr 22

文档可以包含具有null值数据类型的属性(请参阅数据类型文档).然后,这将允许您构造查询以限制website属性所在的结果null.

这与缺少的属性不完全相同,但如果您使用自定义对象将数据写入Firestore,则空属性将自动保存为null而不是根本不保存.您还可以手动/以编程方式将null值写入数据库.

在Android中,我使用以下方法对其进行了测试:

FirebaseFirestore.getInstance().collection("test").whereEqualTo("website", null).get();
Run Code Online (Sandbox Code Playgroud)

我的数据库结构如下所示:

示例firestore结构

这仅返回文档inuwlZOvZNTHuBakS6GV,因为文档9Hf7uwORiiToOKz6zcsXwebsite属性中包含字符串值.

我相信你通常在Swift中开发,不幸的是不支持自定义对象,但是你可以用来为Firestore NSNull()写一个null值.例如(我不熟练使用Swift,所以请随时纠正任何问题):

// Writing data
let docData: [String: Any] = [
    "firstname": "Example",
    "lastname": "User",
    "website": NSNull()
]
db.collection("data").document("one").setData(docData) { err in
    if let err = err {
        print("Error writing document: \(err)")
    } else {
        print("Document successfully written!")
    }
}

// Querying for null values
let query = db.collection("test").whereField("website", isEqualTo: NSNull())
Run Code Online (Sandbox Code Playgroud)

文档没有提到查询不存在的值的方法,因此这似乎是下一个最好的方法.如果有人可以改进或建议替代品,请做.

  • 在考虑了这一点后,它可能需要这样才能使索引工作.如果未设置属性,则可能未对其编制索引,因此无法查询.将该属性设置为null将把文档添加到属性的相应索引.对您的代码的一个评论:我将在稍后尝试,但理论上您的示例也应该使用Swift"nil"而不是NSNull().再次感谢. (2认同)
  • 更新:找到了检查非空值的解决方案 [here](/sf/answers/3393726871/)。 (2认同)