关于mgo的mongoDB操作
刚接触mongodb不久,以前一直写beego的,感觉beego用的库对数据库的封装比较好用,也可能是用习惯的原因。
想要实现的功能是:先查找对应条件的数据,
如果没有找到,则把整个数据结构插入数据库;
如果查找成功,则只更新其中的指定的字段。
很自然直接想到了upsert字段,代码如方法一 UpsertFailed(), 如果不存在最终的结果只会存在update 中set的指定字段,结构体的其余字段自动丢弃了,所以最后必选要手动插入,才能将整个结构体所有字段插入。
后面不得以,只能自己封装一个Upsert函数,如果找到对应结构,则更新指定字段,如果没找到则插入整个结构。
如果感兴趣的可以自己测试一下,也有可能是咱学艺不精。如果有错的地方,大大们请给咱们指正一下,谢谢啦。
还有其余的一处,在利用find()方法查找时,如果想要知道查找的数据是否查到了,需要判断的条件有点多
if err != nil && len(results) != 0 {
//查找成功
}
相比较beego里面的orm包还是有一点不大习惯。本人第一次写博客,排版啥的不好看别见怪。可能代码有参考别人的,也不记得了,没有引用之处敬请见谅。谢谢。
type Heartbeat struct {
Key string `form:"key" json:"key" bson:"key"`
BitCoin string `form:"bit_coin" json:"bit_coin" bson:"bit_coin"`
BitKey string `form:"bit_key" json:"bit_key" bson:"bit_key"`
BitSecret string `form:"bit_secret" json:"bit_secret" bson:"bit_secret"`
BitIsClose bool `form:"bit_is_close" json:"bit_is_close" bson:"bit_is_close"`
OkCoin string `form:"ok_coin" json:"ok_coin" bson:"ok_coin"`
OkKey string `form:"ok_key" json:"ok_key" bson:"ok_key"`
OkScret string `form:"ok_scret" json:"ok_scret" bson:"ok_scret"`
OkIsClose bool `form:"ok_is_close" json:"ok_is_close" bson:"ok_is_close"`
Update int64 `form:"update" json:"update" bson:"update"` //更新时间
Create int64 `form:"create" json:"create" bson:"create"` //创建时间
CreateStr string `form:"create_str" json:"create_str" bson:"create_str"` //创建时间
}
func (m *Heartbeat) TableName() string {
return "heartbeat"
}
//此方式失败
func (m *Heartbeat) UpsertFailed(startTs int64) error {
m.Create = time.Now().Unix()
m.Update = time.Now().Unix()
m.CreateStr = time.Now().Format("2006-01-02 15:04")
find := bson.M{"key": m.Key, "create": bson.M{"$gte": startTs}}
update := bson.M{"$set": bson.M{"bit_coin": m.BitCoin, "bit_key": m.BitKey, "bit_secret": m.BitSecret}}
err := DbSession.DB("ganlan_bc").C(m.TableName()).Update(find, update)
return err
}
//ok,查找返回空len(results)==0插入,查找成功更新指定字段。
func (m *Heartbeat) Upsert(startTs int64) error {
results := make([]MonitorHeartbeat, 5)
m.Create = time.Now().Unix()
m.Update = time.Now().Unix()
m.CreateStr = time.Now().Format("2006-01-02 15:04")
//查询find,找到只更新对应字段,未找到则插入数据;
find := bson.M{"key": m.Key, "create": bson.M{"$gte": startTs}}
update := bson.M{"$set": bson.M{"bit_coin": m.BitCoin, "bit_key": m.BitKey, "bit_secret": m.BitSecret}}
err := DbSession.DB("ganlan_bc").C(m.TableName()).Find(find).All(&results)
if err != nil {
fmt.Println("[Heartbeat.Upsert]查找数据库失败", err)
} else if len(results) == 0 {
DbSession.DB("ganlan_bc").C(m.TableName()).Insert(m)
fmt.Println("[Heartbeat.Upsert]没有找到,则插入数据")
} else {
DbSession.DB("ganlan_bc").C(m.TableName()).Update(find, update)
fmt.Println("[Heartbeat.Upsert]找到数据,更新数据")
}
return err
}