golang中关于mongoDB的update与upsert讨论

                            关于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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值