web-dev-qa-db-ja.com

MongoDBドキュメントの非整列化中にnullを無視する方法は?

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にこの問題の組み込みソリューションはありますか?

6
Andrew

詳細な説明については、演算子 $exists および Nullまたは欠落フィールドのクエリ を使用できます。

Mongo-go-driverでは、以下のクエリを試すことができます。

電子メール=> nilクエリドキュメントに一致電子メールフィールドのいずれかが含まれるnilの値=または電子メールフィールドが含まれていません

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

上記のクエリに$ne演算子を追加するだけで、フィールドemailがないか、またはemailに値nilがないレコードを取得できます。演算子の詳細については $ne

0
krishna Prasad

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 = ""
}
0
Shane