- 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,则光标将在服务器上保持可用,直到达到默认光标超时时间。没有进一步的问题。