mgo 増改查和其他常用函数

  • MongoDB 使用bson存储数据。
  • 翻译谷歌机翻,我觉得翻译的还行
首先初始化mgo 链接

插入

const UserDatabase  = "User"
type User struct {
	Id       string `bson:_id`//在数据库中命名为_id,会代替默认生成的_id,为主键
	Password string
	Email    string
}
// Insert inserts one or more documents in the respective collection.  
//In case the session is in safe mode (see the SetSafe method) and 
//an error happens while inserting the provided documents, the returned error will be of type *LastError.
func (U *User) Create() error {
	con := GetDatabase().C(UserDatabase)
	err := con.Insert(U)
	return err
}

查询

func (U *User) FindOne() (User, error) {
	con := GetDatabase().C(UserDatabase)
	tmp := User{}
	err := con.Find(bson.M{"id": U.Id, "password": U.Password}).One(&tmp)//参数必须是结构体地址
	fmt.Printf("U:%v,%v\n", U.Id, U.Password)
	if err != nil {
		return tmp, err
	}
	return tmp, err
}
//查询所有
err := con.Find(bson.M{"id": U.Id, "password": U.Password}).All(&tmp)
模糊查询
func FindFuzzy(key, find string) (*[]User,  error) {
	con := GetDatabase().C(UserDatabase)
	tmp := []User{}
	conditions := bson.M{key: bson.RegEx{find, "i"}}//构造模糊查询字段
	err := con.Find(conditions).All(&tmp)
	return &tmp, err
}

更新

  • 替换所有字段
func (U *User) Update() error {
	con := GetDatabase().C(UserDatabase)
	err := con.Update(bson.M{"id": U.Id}, U) //不用set会发生替换
	return err
}
  • 使用$set更新相关字段
func (U *User) Update() error {
	con := GetDatabase().C(UserDatabase)
	err := con.Update(bson.M{"id": U.Id}, bson.M{"$set":bson.M{"id": U.Id, "password": U.Password}}) //使用$set只更新相关字段
	return err
}
  • 使用$set不能直接传整个结构体,有默认值会覆盖掉原本的值,只能传bson

Count

func (c *Collection) Count() (n int, err error)

count, err := con.Find(nil).Count()//总数量
  • 统计数量
Skip

func (q *Query) Skip(n int) *Query

err := con.Find(nil).Skip(10).All(&tmp)//跳过前10个结果
  • 跳过跳过查询结果中的n个初始文档。请注意,这仅适用于上限集合,其中文档按插入时间或排序结果自然排序。
SetMaxSCan

func (q *Query) SetMaxScan(n int) *Query

err := con.Find(nil).SetMaxScan(10).All(&tmp)//扫描10个结果后停止
  • SetMaxScan限制查询在扫描指定数量的文档后停止。
    此修饰符通常用于防止可能长时间运行的查询通过扫描过多数据来中断性能。
Limit

func (q *Query) Limit(n int) *Query

err := con.Find(nil).Limit(10).All(&tmp)//扫描10个文档后停止
  • 搜索文档最大数量为n。
iter

func (q *Query) Iter() *Iter

iter := con.Find(bson.M{"id": U.Id, "password": U.Password}).Iter()//返回迭代器,使用next()遍历
  • Iter执行查询并返回一个能够遍历所有结果的迭代器。结果将以可配置大小的批量返回(请参阅批处理方法),并且当迭代可配置数量的文档时将请求更多文档(请参阅预取方法)。
iter.Next

func (iter *Iter) Next(result interface{}) bool

err := con.Find(bson.M{"id": U.Id}).Iter()//返回迭代器,使用next()遍历
result:= User{}
for iter.Next(&result) {//当遍历完结果后为false
    fmt.Println(result)
}
  • Next从结果集中检索下一个文档,必要时进行阻止。当前一个文档耗尽时,此方法还将自动从服务器检索另一批文档,如果启用了预取,则此方法将在后台自动检索(请参阅Query.Prefetch和Session.SetPrefetch方法)。
  • 如果文档已成功解组到result上,则返回true,如果结果集末尾处于false状态,或者发生错误,则返回false。当Next返回false时,应调用Err方法以验证迭代期间是否存在错误。
iter.close

func (iter *Iter) Close() error

if err := iter.Close(); err != nil {
    return err
}
  • Close会终止迭代器使用的服务器游标(如果有),如果在迭代期间没有发生错误则返回nil,否则返回实际错误。
  • 服务器游标在迭代结束时自动关闭,这意味着除非在服务器完成向驱动程序发送结果之前中断迭代,否则关闭将不执行任何操作。如果在这种情况下未调用Close,则光标将在服务器上保持可用,直到达到默认光标超时时间。没有进一步的问题。

参考


mgo-GoDoc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值