假设我有一个带有一些可选属性的数据模型。这可以是例如具有“firstname”,“lastname”和可选的“website”属性的用户对象。
在Cloud Firestore中,只有具有已知网站的用户文档才会设置“网站”属性,对于所有其他用户文档,此属性将不存在。
我现在的问题是如何查询所有用户文档没有“网站”属性。
感谢。
答案 0 :(得分:15)
文档可以包含null
值数据类型的属性(请参阅data types documentation)。这将允许您构造查询以限制website
属性为null
的结果。
这与缺少的属性不完全相同,但如果您使用custom objects将数据写入Firestore,则空属性将自动保存为null
,而不是根本不保存。您还可以手动/以编程方式将null
值写入数据库。
在Android中,我使用以下方法对此进行了测试:
FirebaseFirestore.getInstance().collection("test").whereEqualTo("website", null).get();
我的数据库结构如下所示:
这只返回了文档inuwlZOvZNTHuBakS6GV
,因为文档9Hf7uwORiiToOKz6zcsX
在website
属性中包含字符串值。
我相信您通常会使用Swift进行开发,但遗憾的是,自定义对象不受支持,但您可以使用NSNull()
向Firestore写入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())
文档没有提到查询不存在的值的方法,因此这似乎是下一个最好的方法。如果有人可以改进或建议替代方案,请做。