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": }).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

mongodb驱动接口的更多相关文章

  1. TODO:Linux安装PHP MongoDB驱动

    TODO:Linux安装PHP MongoDB驱动 PHP利于学习,使用广泛,主要适用于Web开发领域. MongoDB的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)以及传统的RDBMS系统 ...

  2. MongoDB 驱动以及分布式集群读取优先级设置

    本文主要介绍使用MongoDB C驱动读取分布式MongoDB集群时遇到的坑,主要在读取优先级和匹配tag上:同时简单介绍Python驱动.Node.js驱动.Mongoose驱动如何使用读取优先级和 ...

  3. 安装golang的mongodb驱动mgo速记

    这里介绍的方法只适用于Centos平台,测试版本为centos 6.5 下载源码安装实在麻烦,这里采用比较简单的方法给GO安装mongodb驱动 安装mgo之前,需要先安装bzr yum -y ins ...

  4. 【30集iCore3_ADP出厂源代码(ARM部分)讲解视频】30-13 emWin底层驱动接口介绍

    视频简介:该视频介绍emWin底层驱动接口. 源视频包下载地址:链接:http://pan.baidu.com/s/1nvPpC2d 密码:cbb7 银杏科技优酷视频发布区:http://i.youk ...

  5. 怎奈风云多变换,骚完一波还一波,记PHP mongodb驱动的2019年11月用法

    怎么,觉得pecl下一个扩展包,phpize make make install  php.ini里引用一下 mongodb.so就万事大吉了? Deeply Sorry!看到MongoDB\Driv ...

  6. Java的MongoDB驱动及读写策略

    网上看见一篇博文,详细讲了MongoDB读写策略,将来生产会遇到类似的问题,转来备查. 指定新mongo实例: Mongo m = new Mongo(); Mongo m = new Mongo( ...

  7. 技术讨论]mongodb驱动的正确使用方法

    原文地址:http://cnodejs.org/topic/5190d61263e9f8a542acd83b mongo数据库在nodejs平台有2个常用驱动,mongodb和mongoose,mon ...

  8. VS2017 + Windows10编译C++ MongoDB驱动

    转载地址:https://blog.csdn.net/sqcfj/article/details/86716831 mongoDB有两个接口库:mongo-c-driver和mongo-cxx-dri ...

  9. 利用Warensoft Stock Service编写高频交易软件--客户端驱动接口说明

    Warensoft Stock Service Api客户端接口说明 Warensoft Stock Service Api Client Reference 本项目客户端驱动源码已经发布到GitHu ...

随机推荐

  1. CentOS下安装Tomcat

    CentOS版本:CentOS-7-x86_64-Minimal-1810 1.安装JDK 详情查看:CentOS下安装JDK-rpm文件.CentOS安装JDK-tar.gz文件 2.下载tomca ...

  2. maven本地仓库配置文件

    背景:在使用maven的过程中,感觉本地的jar包位置飘忽不定,归根结底是因为对maven的配置文件理解不清楚造成的. 在maven的安装包下面D:\apache-maven-3.6.1\conf有s ...

  3. Oracle Spatial分区应用研究之五:不同分区粒度+本地空间索引效率对比

    1.实验目的 若使用本地空间索引,不同分区粒度将产生不同索引组织,其索引分区个数.大小.R-TREE树结构均不相同.那么,在什么分区粒度下的本地空间索引效率较高呢? 2实验数据 实验数据为全国2531 ...

  4. activiti学习6:启动流程后动态获取流程图

    目录 activiti学习6:启动流程后动态获取流程图 一.绘图原理 二.根据流程定义id绘图 三.根据流程实例id绘图 3.1 基本原理 3.2 当前节点的获取 3.3 走过的节点的获取 3.4 绘 ...

  5. 移动端1px边框解决方案

    在retina屏中,像素比为2(iPhone6/7/8)或3(iPhone6Plus/7Plus/8Plus),1px的边框看起来比真的1px更宽. 使用伪类加transform的方式 元素本身不定义 ...

  6. Django框架(十二)-- 中间件、CSRF跨站请求伪造

    中间件 一.什么是中间件 请求的时候需要先经过中间件才能到达django后端(urls,views,templates,models) 响应的时候也需要经过中间件才能到达web服务网关接口 djang ...

  7. SQL语句报错:Incorrect string value: '\xE9\x98\xBF\xE6\x96\xAF...'

    很明显是编码的问题.检查了一下$conn->query("set names utf8");已经加在代码里了.那莫非是数据库编码不是utf8? 看了一下 还真不是 于是右键要 ...

  8. golang --写test测试用例

    安装gotests插件自动生成测试代码: go get -u -v github.com/cweill/gotests/... 如何编写测试用例 由于go test命令只能在一个相应的目录下执行所有文 ...

  9. Map 集合按字母排序方法

    @Testpublic void testMapSort() { Map<String, String> map = new HashMap<>(); map.put(&quo ...

  10. Java单元测试 Http Server Mock框架选型

    背景动机 某期优化需要针对通用的HttpClient封装组件--HttpExecutor在保证上层暴露API不动的前提做较多改动,大致包括以下几点: apache http client 版本升级 H ...