2017-10-18 3 views
4

Disons que j'ai un modèle de données avec des propriétés facultatives. Cela pourrait être par exemple un objet utilisateur avec un "prénom", un "nom de famille" et une propriété "site web" optionnelle. Dans Cloud Firestore, seuls les documents utilisateur ayant un site Web connu ont la propriété "site Web" définie. Pour tous les autres documents utilisateur, cette propriété n'existe pas. Mes questions est maintenant comment faire une requête pour tous les documents utilisateur sans une propriété "site Web".Comment interroger Cloud Firestore pour les clés de documents inexistantes

Merci.

Répondre

7

Les documents peuvent contenir des propriétés avec un type de données de valeur null (voir data types documentation). Cela vous permettra ensuite de construire une requête pour limiter les résultats où la propriété website est null. Ce n'est pas tout à fait la même chose qu'une propriété manquante, mais si vous utilisez custom objects pour écrire des données dans Firestore, les propriétés vides seront automatiquement enregistrées sous la forme null plutôt que pas du tout. Vous pouvez également écrire manuellement/par programmation une valeur null dans la base de données.

Dans Android, j'ai testé cela en utilisant les éléments suivants:

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

où ma structure de base de données ressemblait à:

example firestore structure

Ce ne sont rentrés que le document inuwlZOvZNTHuBakS6GV, parce que le document 9Hf7uwORiiToOKz6zcsX contient une chaîne valeur dans la propriété website.

Je crois que vous développez habituellement dans Swift, où malheureusement les objets personnalisés ne sont pas supportés, mais vous pouvez utiliser NSNull() pour écrire une valeur null à Firestore. Par exemple (je ne suis pas compétent dans Swift, alors ne hésitez pas à corriger les problèmes):

// 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()) 

La documentation ne mentionne pas une méthode pour interroger des valeurs qui n'existent pas, donc cela semble être le prochaine meilleure approche. Si quelqu'un peut améliorer ou suggérer des alternatives, s'il vous plaît faites.

+1

Merci beaucoup pour cette réponse élaborée. – Georg

+0

C'était un plaisir, d'autant plus que c'était ma première exposition à Swift, alors j'ai aussi appris quelque chose! Merci d'accepter. – Grimthorr

+2

Après avoir envisagé cela un peu, il faut probablement que ce soit comme ça que l'indexation fonctionne. Si une propriété n'est pas définie, elle n'est probablement pas indexée et ne peut donc pas être interrogée. Définir la propriété sur null ajoutera le document à l'index respectif de la propriété. Un commentaire à votre code: Je vais l'essayer plus tard moi-même mais en théorie votre exemple devrait aussi fonctionner en utilisant le Swift "nil" au lieu de NSNull(). Merci encore. – Georg