假設我有一個包含一些可選屬性的數據模型。這可以是例如具有「名字」,「姓氏」和可選的「網站」屬性的用戶對象。如何查詢雲存儲Firestore中不存在的文檔密鑰
在Cloud Firestore中,只有具有已知網站的用戶文檔纔會設置「網站」屬性,對於該屬性不存在的所有其他用戶文檔。
我的問題是現在如何查詢所有用戶文件沒有一個「網站」屬性。
謝謝。
假設我有一個包含一些可選屬性的數據模型。這可以是例如具有「名字」,「姓氏」和可選的「網站」屬性的用戶對象。如何查詢雲存儲Firestore中不存在的文檔密鑰
在Cloud Firestore中,只有具有已知網站的用戶文檔纔會設置「網站」屬性,對於該屬性不存在的所有其他用戶文檔。
我的問題是現在如何查詢所有用戶文件沒有一個「網站」屬性。
謝謝。
文檔可以包含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
值。例如(我不是斯威夫特精通,所以隨時糾正任何問題):
// 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())
的文檔沒有提到的方法來查詢不存在的值,因此這似乎是次佳方法。如果任何人都可以改進或建議替代品,請做。
非常感謝你這個精心設計的答案。 – Georg
很高興,特別是因爲這是我第一次接觸Swift,所以我也學到了一些東西!感謝接受。 – Grimthorr
考慮到這一點之後,可能需要這種方法才能使索引工作。如果一個屬性沒有設置,它可能沒有被索引,因此不能被查詢。將該屬性設置爲null會將文檔添加到屬性的相應索引。 對你的代碼的一條評論:我稍後會自己嘗試,但理論上你的例子還應該使用Swift「nil」而不是NSNull()。 再次感謝。 – Georg