sql >> データベース >  >> NoSQL >> MongoDB

時間でドキュメントを挿入するときにデフォルトの日付を設定します。時間フィールド

    Goでは、フィールドのデフォルト値を定義できません。新しい構造体値が作成されると、フィールドは常にそのタイプのゼロ値になります(別の値を明示的に指定できる複合リテラルを使用する場合を除く)。

    >

    したがって、1つのオプションは、コンストラクターのような関数NewUser()を作成することです。 これにより、このフィールドが設定され、常にこの関数を使用して新しいユーザーが作成されます。

    func NewUser() *User {
        return &User{
            CreatedAt: time.Now(),
        }
    }
    

    もちろん、これを強制することはできません。また、これはUserのタイムスタンプを保持します。 保存時ではなく、構造体の値の作成。

    もう1つのより良いアプローチは、カスタムマーシャリングロジックを使用することです。

    bson.Getterを実装することで、カスタムマーシャリングロジックを記述できます。 。 GetBSON() 実際に保存される値を提供する責任があります。同じUserが必要です 保存するインスタンス、そのCreatedAt 前に設定されたフィールド:

    type User struct {
        CreatedAt time.Time `json:"created_at" bson:"created_at"`
    }
    
    func (u *User) GetBSON() (interface{}, error) {
        u.CreatedAt = time.Now()
        type my *User
        return my(u), nil
    }
    

    新しいmy タイプが作成されて返されます。これは、スタックオーバーフローを回避するためです。タイプ*Userの値を返すだけです bson.Getterを実装しているため、悪いです 、したがってGetBSON() 延々と呼ばれるでしょう。新しいmy typeにはこのメソッドがないため、無限の「再帰」は発生しません(type キーワードは新しいタイプを作成し、基になるタイプのメソッドを「継承」しません。

    このソリューションは、CreatedAtも上書き(リセット)することに注意してください。 フィールド)Userを再保存したい場合でも 。したがって、CreatedAtかどうかのチェックを追加する必要があります フィールドに入力し、ゼロ値の場合にのみ設定します:

    func (u *User) GetBSON() (interface{}, error) {
        if u.CreatedAt.IsZero() {
            u.CreatedAt = time.Now()
        }
        type my *User
        return my(u), nil
    }
    

    関連する/同様の質問も参照してください:GoからMongoDBにアクセスする




    1. mongodb.conf bind_ip =127.0.0.1は機能しませんが、0.0.0.0は機能します

    2. MongoDBのインデックス

    3. mongodb$existsは常に0を返します

    4. Mongodbは、今日の日付で作成された結果を検索します