• mongodb驱动接口


    mongodb对外接口或驱动:https://docs.mongodb.com/ecosystem/drivers/,包含C,C++,Go,Python等。

    C驱动

    mongodb的C驱动,即libmongoc,是一个用于开发mongodb的C库。依赖libbson,libbson用于生成和解析BSON documents。

    mongoDB C Driver官网:http://mongoc.org/libmongoc/current/index.html

    安装

    下载最新的1.14.1tar包安装(mongo-c-driver-1.14.1.tar.gz)。

    sudo apt-get install cmake libssl-dev libsasl2-dev

    $ wget https://github.com/mongodb/mongo-c-driver/releases/download/x.y.z/mongo-c-driver-x.y.z.tar.gz
    $ tar xzf mongo-c-driver-x.y.z.tar.gz
    $ cd mongo-c-driver-x.y.z
    $ mkdir cmake-build
    $ cd cmake-build
    $ cmake -DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF ..
    $ make
    $ sudo make install
    $ sudo make uninstall

    编译链接

    gcc -o hello_mongoc hello_mongoc.c $(pkg-config --libs --cflags libmongoc-1.0)
    gcc -o hello_mongoc hello_mongoc.c $(pkg-config --libs --cflags libmongoc-static-1.0)
    $ gcc -o hello_mongoc hello_mongoc.c 
        -I/usr/local/include/libbson-1.0 -I/usr/local/include/libmongoc-1.0 
        -lmongoc-1.0 -lbson-1.0
    $ ./hello_mongoc

    增删改查

    参考:Basic CRUD Operations

    Go驱动

    mongodb的Go驱动很多,官方提供的驱动:https://godoc.org/go.mongodb.org/mongo-driver/mongo 或 https://docs.mongodb.com/ecosystem/drivers/go/

    edgex中用到的是mgo(社区版):https://github.com/globalsign/mgohttps://godoc.org/github.com/globalsign/mgo。其clone于gopkg.in/mgo.v2(不再更新)。

    mgo的核心基于session,Dail()基于url建立连接用于后续的查询:

    session, err := mgo.Dial(url)
    c := session.DB(database).C(collection)
    err := c.Find(query).One(&result)

    函数原型:

    func (c *Collection) Find(query interface{}) *Query

    Find prepares a query using the provided document. The document may be a map or a struct value capable of being marshalled with bson.

    The map may be a generic one using interface{} for its key and/or values, such as bson.M, or it may be a properly typed map.

    Providing nil as the document is equivalent to providing an empty document such as bson.M{}.

    func (q *Query) One(result interface{}) (err error)

    One executes the query and unmarshals the first obtained document into the result argument.

    The result must be a struct or map value capable of being unmarshalled into by gobson.

    This function blocks until either a result is available or an error happens. For example:

    err := collection.Find(bson.M{"a": 1}).One(&result)

    查询语句语法参考:https://docs.mongodb.com/manual/tutorial/query-documents/

    package main
    
    import (
        "fmt"
        "gopkg.in/mgo.v2"
        "gopkg.in/mgo.v2/bson"
    )
    
    type Person struct {
        Name string
        Phone string
    }
    
    func main() {
        session, err := mgo.Dial("127.0.0.1")
        if err != nil {
            panic(err)
        }
        defer session.Close()
    
        session.SetMode(mgo.Monotonic, true)
    
        c := session.DB("test").C("people")
        err = c.Insert(&Person{"Ale", "+55 53 8116 9639"},
            &Person{"Cla", "+55 53 8402 8510"})
        if err != nil {
            panic(err)
        }
    
        result := Person{}
        err = c.Find(bson.M{"name": "Ale"}).One(&result)
        if err != nil {
            panic(err)
        }
    
        fmt.Println("Phone:", result.Phone)
    }

    mgo中session

    Strong
    session 的读写一直向主服务器发起并使用一个唯一的连接,因此所有的读写操作完全的一致。
    Monotonic
    session 的读操作开始是向其他服务器发起(且通过一个唯一的连接),只要出现了一次写操作,session 的连接就会切换至主服务器。

    由此可见此模式下,能够分散一些读操作到其他服务器,但是读操作不一定能够获得最新的数据。
    Eventual
    session 的读操作会向任意的其他服务器发起,多次读操作并不一定使用相同的连接,也就是读操作不一定有序。session 的写操作总是向主服务器发起,但是可能使用不同的连接,也就是写操作也不一定有序。

    mgo中全局session有两个问题:

    1)效率问题。全局session只有一个socket,不支持并发。

    2)mgo.Session缓存的一主一从连接,实例本身不负责维护,需要应用维护。也就是说,slaveSocket,masterSocket任意其一,连接断开,Session自己不会重置缓存,该Session的使用者如果不主动重置缓存,调用者得到的将永远是EOF这种情况在主从切换时就会发生,在网络抖动时也会发生。这是致命的,连接断开或MongoDB重启时永远连接不上,报EOF。

    解决全局session问题的方法有两个,采用SessionCopy机制或Eventual模式。Copy机制时,每次查询都用一个session,查询完后关闭session,让mgo维护session复用。

    参考:

    https://cardinfolink.github.io/2017/05/17/mgo-session/  mgo的session与连接池

    https://www.bbsmax.com/A/rV574pAXdP/ golang mgo的mongo连接池设置:必须手动加上maxPoolSize

    mgo中日志实现

        // 实现 mongo.Logger 的接口
        type MongoLog struct {
        }
        
        func (MongoLog)Output(calldepth int, s string) error {
            log.SetFlags(log.Lshortfile)
            return log.Output(calldepth,s)
        }
        mgo.SetDebug(true)  // 设置DEBUG模式
        mgo.SetLogger(new(MongoLog)) // 设置日志. 

    要使日志使能,必须SetLogger()。

    参考:

    1. Go Web编程 5.6 NOSQL数据库操作
    2. http://labix.org/mgo
    3. http://labix.org/gobson
    4. https://gopkg.in/mgo.v2 可参考文档
    5. https://godoc.org/github.com/globalsign/mgo#Session.SetMode
  • 相关阅读:
    WCF添加服务失败。服务元数据可能无法访问。请确保服务正在运行并且正在公开元数据。
    【C#】 实现WinForm中只能启动一个实例
    centos7防火墙问题
    ftp搭建记录
    centos7常用命令
    RocketMQ部署
    mongedb主从
    redis 主从复制+读写分离+哨兵
    keepalive+nginx
    分布架构分析
  • 原文地址:https://www.cnblogs.com/embedded-linux/p/11785542.html
Copyright © 2020-2023  润新知