sql >> Databasteknik >  >> NoSQL >> MongoDB

Anpassa mgo upsert-operationen

För att svara på "Min riktiga fråga:Hur kan jag anpassa beteendet hos mgo innan uppsättning? " - du kan anpassa bson marshalling genom att definiera bson Getter till modellen.

För att illustrera hur det fungerar, låt oss förenkla modellen för att undvika kapslade dokument:

type Game struct {
    ID int `bson:"_id"`
    Name string
    Stats [] float64
}

Med newGame enligt följande:

newGame := Game{
    ID: 1,
    Name: "foo",
    Stats: []{5.0}
}

Uppdateringen col.UpsertId(newGame.ID, newGame) som standard marshals newGame till JSON, producerar mongo-fråga som:

update({_id:1}, {name: "foo", stats: [5]}, {upsert: true});

För att använda $set , $push etc, du kan definiera en anpassad bson getter. T.ex.

func (g Game) GetBSON() (interface{}, error) {
    return bson.M{
        "$set": bson.M{"name": g.Name}, 
        "$push": bson.M{"stats": bson.M{"$each": g.Stats}},
    }, nil
}

Så uppdateringen col.UpsertId(newGame.ID, newGame) kommer att producera en mongodb-fråga

update({_id:1}, {$set: {name: "foo"}, $push: {stats: {$each: [5]}}}, {upsert: true});

För att göra det kristallklart - den anpassade marshalern kommer att användas i alla mgo-frågor, så du vill antagligen inte definiera den direkt till modellen, utan till dess derivata som endast ska användas i upsert-operationer:

type UpdatedGame struct {
    Game
}

func (g UpdatedGame) GetBSON() (interface{}, error) {
    return bson.M{....}
}

.....

newGame := Game{
    ID: 1,
    Name: "foo",
    Stats: []{5.0}
}

col.UpsertId(newGame.ID, UpdatedGame{newGame})



  1. skapa logik inuti Spring Batch med Tasklet eller inuti CompositeItemWriter?

  2. MongoDB skiftlägesokänsligt index börjar med prestandaproblem

  3. Rensa föräldralösa filer från GridFS

  4. hur kan man lagra en Json i redis med hashmap(HSET)