2017-10-18 91 views
4

假設我有一個包含一些可選屬性的數據模型。這可以是例如具有「名字」,「姓氏」和可選的「網站」屬性的用戶對象。如何查詢雲存儲Firestore中不存在的文檔密鑰

在Cloud Firestore中,只有具有已知網站的用戶文檔纔會設置「網站」屬性,對於該屬性不存在的所有其他用戶文檔。

我的問題是現在如何查詢所有用戶文件沒有一個「網站」屬性。

謝謝。

回答

7

文檔可以包含null值數據類型的屬性(請參閱data types documentation)。這將允許您構建查詢以限制website屬性爲null的結果。

這與缺少的屬性並不完全相同,但如果使用custom objects將數據寫入Firestore,則空屬性將自動保存爲null而非根本不存在。您也可以手動/以編程方式將null值寫入數據庫。

在Android中,我測試了使用下列內容:

FirebaseFirestore.getInstance().collection("test").whereEqualTo("website", null).get(); 

在哪裏我的數據庫結構看上去像:

example firestore structure

這僅返回文檔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()) 

的文檔沒有提到的方法來查詢不存在的值,因此這似乎是次佳方法。如果任何人都可以改進或建議替代品,請做。

+1

非常感謝你這個精心設計的答案。 – Georg

+0

很高興,特別是因爲這是我第一次接觸Swift,所以我也學到了一些東西!感謝接受。 – Grimthorr

+2

考慮到這一點之後,可能需要這種方法才能使索引工作。如果一個屬性沒有設置,它可能沒有被索引,因此不能被查詢。將該屬性設置爲null會將文檔添加到屬性的相應索引。 對你的代碼的一條評論:我稍後會自己嘗試,但理論上你的例子還應該使用Swift「nil」而不是NSNull()。 再次感謝。 – Georg