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. Automl基于超大数据下的数据分发方案探讨

    先定义几个关键字: 任务:用户一次上传的数据集并发起的automl任务,比如一次ocr任务,一次图像分类任务. 模型:一次任务中,需要运行的多个模型,比如ocr任务,需要ctpn模型,需要crnn模型 ...

  2. [Golang] http.Post导致goroutine泄漏

    记录一个用http.Post的问题 if _, err := http.Post("http://127.0.0.1:8080", "", nil); nil ...

  3. elk使用记录

    1.使用elk查询接口的时候 几个常用参数  http_host.raw 2.具体的接口名称:request_uri 3.想要把左边要查询的显示出来

  4. [K8s] Kubernetes 是什么 不是什么

    现在有三种部署方式,传统物理机部署.虚拟机部署.容器化部署. 我们现在所使用的云上服务器一般都是虚拟化出来的,硬件资源独立,操作系统等软件资源亦独立. 容器化的好处是更轻量,复用下层的操作系统,相当于 ...

  5. [IISNode] 如何在IIS7/8下,配置一个可以通过IIS访问NodeJS的web项目

    参考了一下几篇很给力的文章,在每篇文章中,都学到了解决遇到的问题的答案: (1)用iisnode模块,让你的Node.js应用跑在Windows系统IIS中 (2)让IIS能够运行Nodejs (3) ...

  6. Oracle Spatial分区应用研究之七:同等分区粒度下全局索引优于分区索引的原因分析

    1.实验结论 同等分区粒度下,使用分区空间索引进行空间查询,比使用全局空间索引进行查询,对数据字典表的访问次数更多.假设分区数为X,则大概多3X次访问.具体说明见6实验结论. 2.实验目的 在之前的测 ...

  7. excel数据分析流程

    1.获取数据 2.去掉空值.空行.重复行 3.去掉无用行,筛选出需要行 4.分组数据 5.数据排序

  8. C复习 (C premier plus和C和指针)

  9. Oracle Round 函式 (四捨五入)

    Oracle Round 函式 (四捨五入)描述 : 傳回一個數值,該數值是按照指定的小數位元數進行四捨五入運算的結果.SELECT ROUND( number, [ decimal_places ] ...

  10. ansible debugger 模块

    在搞TF(tungstenfabric)时遇到了一些错误,TF通过ansible playbook 来部署的.通常情况下遇到错误都是通过ansibale xxxx –vvv 来详细输出一下.出错的类型 ...