MongoDBドキュメントをGo構造体に非マーシャリングするときにnull型を無視できるようにする方法があるかどうか知りたいのですが。
現在、次のような自動生成のGo構造体があります。
type User struct {
Name string `bson:"name"`
Email string `bson:"email"`
}
この構造体で宣言された型を変更することはオプションではなく、ここに問題があります。完全に制御できないMongoDBデータベースでは、一部のドキュメントがnull値で挿入されていますが、最初はnullを予期していませんでした。このようなもの:
{
"name": "John Doe",
"email": null
}
構造体内で宣言された文字列型はポインタではないため、nil
値を受け取ることができないため、構造体でこのドキュメントを非整列化しようとすると、エラーが返されます。
この種のドキュメントがデータベースに挿入されないようにすることは理想的なソリューションですが、私の使用例では、null値を無視することも許容されます。したがって、ドキュメントを非整列化した後、私のUserインスタンスは次のようになります
User {
Name: "John Doe",
Email: "",
}
いくつかの注釈フラグ、またはメソッドFind
/FindOne
に渡される可能性のあるオプション、あるいはnullパラメータを含むフィールドを返さないようにするクエリパラメータを見つけようとしていますデータベースから。今まで成功なし。
Mongo-go-driverにこの問題の組み込みソリューションはありますか?
詳細な説明については、演算子 $exists
および Nullまたは欠落フィールドのクエリ を使用できます。
Mongo-go-driverでは、以下のクエリを試すことができます。
電子メール=> nilクエリドキュメントに一致電子メールフィールドのいずれかが含まれるnilの値=または電子メールフィールドが含まれていません。
cursor, err := coll.Find(
context.Background(),
bson.D{
{"email", nil},
})
上記のクエリに$ne
演算子を追加するだけで、フィールドemailがないか、またはemailに値nil
がないレコードを取得できます。演算子の詳細については $ne
MongoDBレコードでnullになる可能性のあるフィールドが事前にわかっている場合は、代わりに構造体でポインタを使用できます。
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
}
Mongoからデコードした後、この値を使用するものすべてをより防御的にコーディングする必要があることを覚えておいてください。例:
var reliableVal string
if User.Email != nil {
reliableVal = *user.Email
} else {
reliableVal = ""
}