MongoDB的go接口使用

主要是基本的添加,查询和更新数据没有删除数据,具体的其他的方法可以参考MongoDB源码里的test文件,以下代码就是从源码的test中提取出的简单MongoDB接口使用方法

package main

import (
    "fmt"
    "gopkg.in/mgo.v2"
    "gopkg.in/mgo.v2/bson"
)

type base struct {  //go语言的结构体命名最好为双驼峰格式,此处的传入MongoDB接口的结构必须使用驼峰格式
    Name string `bson: name`
    Age uint16  `bson: age`
}

func main() {
    url := "mongodb://localhost"  //不使用密码验证登录
    url := "mongodb://xxx:111111@localhost" //使用密码验证登录库,xxx为用户名,111111为密码
    
    session, err := mgo.Dial(url) //登录MongoDB
    defer session.Close()         //defer在函数结束时调用,关闭数据库连接

    if err != nil {
        fmt.Printf("MongoDB connect failed!\n")
        return
    }

    result := struct {errmsg string}{} //使用:=进行变量定义时不需要使用变量类型,该方法只能用于局部变量定义
    session.Run(bson.M{{"create", "stu_msg"}, {"size", 1024}}, &result) //创建一个库,mongodb的存储格式是json串二进制格式,在存入数据时同样使用json格式
    stu := session.DB("stu_msg").C("base") //选择stu_msg库的base集合

    /*    //其他的登录验证方式, 
    admindb := session.DB("admin")
    err := admindb.Login("xxx", "111111")
    //-------------------------------------
    cred := mgo.Credential{
        Username: "xxx",       //定义并初始化时使用":"复制
        Password: "111111"
    }
    err = session.Login(&cred)
    */   //go好像不支持使用该种注释方式
    
    //insert
    stu.Insert(bson.M{"name":"abc", "age":17})
    stu.Insert(bson.M{"_id":bson.NewObjectId(), "name":"abc", "age":17})//_id的值在数据库中会自己生成,此处手动添加
    stu.Insert(bson.M{"name":"abc", "age":17}, bson.M{"name":"def", "age":18},bson.M{"name":"hij", "age":19})//多文档插入

    //update and insert, 存在便更新,不存在便插入
    stu.Upsert(bson.M{"name":"abc"}, bson.M{"$set": bson.M{"age":171}}) //前面是条件,后面是要修改的内容
    
    //find
    BaseOne := base{}
    err = stu.Find(bson.M{"name":"abc"}).One(&BaseOne)
    if err != nil {
        fmt.Printf("MongoDB find failed!\n")
        return
    }
    fmt.Printfln(BaseOne)  //Printfln是根据结构类型进行打印

    res := []base
    cnt, err := stu.Find(nil).Count()
    err := stu.Find(nil).All(&res)
    fmt.Printfln(res)
}
最近重构并优化了一套后端服务的代码: 1. 设计并开发高效的C++对象池算法,时间复杂度为 O(1) 在整个重构框架中,对象池是负责管理内存的底层基本模块 2. 利用命令模式的思想开发 Redis 子模块 抽象出方便高效的接口提供给上层程序员使用 3. 利用组合模式和装饰模式的思想开发 MongoDB 数据库查询条件装饰器 将查询条件和数据库 MongodbModule 数据模型进行解耦合 4. 抽象出一套 MongoDB Module 结果集接口 通过模板和特化技术实现 string/int 等不同索引类型的结果集 5. 开发 AbstractMongodbModule 类处理通用的 MongoDB 数据库表数据操作 数据库中不同的表都有自己的 AbstractMongodbModule 子类对应 6. 用 Perl 开发自动代码生成器,上层程序员对照数据库表结构写 .tmpl 配置文件, 自动生成该数据库表的 MongodbModule 子类,减轻程序员新增表时的工作量 7. 结合 Redis 模块和 MongoDB 模块,开发 HierarchicalModule 分层数据模型 构造一个 Redis 缓存层 + MongoDB 持久层的后台 Server 架构 并通过简单方便的接口供上层程序员使用,具体的数据分层处理对上层程序员是黑盒的 8. 设计并开发整套缓存层使用的 KEY 规则,方便缓存更新 结合公司的数据订阅系统进行 Redis缓存层 + MongoDB 持久层数据更新功能 9. 重构后的分层数据架构比原有接口效率提高 5 - 400 倍(返回数据记录条数从 150 - 5 条) 绝大部分时间后端接口需要获取记录个数在 50 以内,所以效率提升在 100 倍左右
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值