web-dev-qa-db-fra.com

Comment ignorer les valeurs nulles lors du démasquage d'un document MongoDB?

Je voudrais savoir s'il existe une approche qui me permettrait d'ignorer les types nuls tout en démasquillant un document MongoDB dans une structure Go.

En ce moment, j'ai des structures Go auto-générées, quelque chose comme ceci:

type User struct {
  Name  string `bson:"name"`
  Email string `bson:"email"`
}

Changer les types déclarés dans cette structure n'est pas une option, et voici le problème; dans une base de données MongoDB, dont je n'ai pas le contrôle total, certains documents ont été insérés avec des valeurs nulles à l'origine je ne m'attendais pas à des valeurs nulles. Quelque chose comme ça:

{
  "name": "John Doe",
  "email": null
}

Comme les types de chaîne déclarés à l'intérieur de ma structure ne sont pas des pointeurs, ils ne peuvent pas recevoir de valeur nil, donc chaque fois que j'essaye de démasquer ce document dans ma structure, il retourne une erreur.

Empêcher l'insertion de ce type de document dans la base de données serait la solution idéale, mais pour mon cas d'utilisation, ignorer les valeurs nulles serait également acceptable. Donc, après avoir démêlé le document, mon instance d'utilisateur ressemblerait à ceci

User {
  Name:  "John Doe",
  Email: "",
}

J'essaie de trouver, soit un indicateur d'annotation, soit une option qui pourrait être transmise à la méthode Find/FindOne, ou peut-être même un paramètre de requête pour empêcher de retourner tout champ contenant des valeurs nulles à partir de la base de données. Sans succès jusqu'à présent.

Existe-t-il des solutions intégrées dans le pilote mongo-go pour ce problème?

6
Andrew

Vous pouvez passer par l'opérateur $exists et Requête pour les champs nuls ou manquants pour une explication détaillée.

Dans le pilote mongo-go, vous pouvez essayer la requête ci-dessous:

La requête email => nil correspond aux documents qui contiennent le champ email dont la valeur est nil ou que ne contient pas le champ e-mail.

cursor, err := coll.Find(
   context.Background(),
   bson.D{
      {"email", nil},
})

Vous devez simplement ajouter le $ne dans la requête ci-dessus pour obtenir les enregistrements qui n'ont pas le champ e-mail ou n'ont pas la valeur nil dans l'e-mail. Pour plus de détails sur l'opérateur $ne

0
krishna Prasad

Si vous savez à l'avance quels champs pourraient potentiellement être nuls dans vos enregistrements mongoDB, vous pouvez utiliser des pointeurs dans vos structures à la place:

type User struct {
  Name  string `bson:"name"` // Will still fail to decode if null in Mongo
  Email *string `bson:"email"` // Will be nil in go if null in Mongo
}

N'oubliez pas que vous devrez maintenant coder de manière plus défensive autour de tout ce qui utilise cette valeur après le décodage de mongo, par exemple:

var reliableVal string
if User.Email != nil {
    reliableVal = *user.Email
} else {
    reliableVal = ""
}
0
Shane