首页 > 代码库 > Mongodb杂谈(一)

Mongodb杂谈(一)

Mongodb杂谈(一)


开始学习mongodb时,找一些中文博客看。后来发现很多知识都搜不到,最后还是看官方网站和权威指南,还是这两者靠谱,闲的时候可以多浏览一下。此文总结一下我入门学习mongodb的经验。

 

Mongo shell操作mongodb

安装完mongodb客户端后,通过shelll来操作mongodb。我是在Ubuntu使用客户端的,直接用apt-get来安装,比较简单。

 

方法1交互式(类似mysql)

连接格式mongo host:port/dbName –u userName –p password

linger@ubuntu:~/data/test4$ mongo localhost:9019/admin–u linger –p 123123

show dbs;

show tables;


方法2脚本式

mongo –nodb 进入mongo解释器

> Master=new Mongo("localhost:9019")

connection to localhost:9019

> Mdb=Master.getDB("admin")

admin

> Mdb.auth("linger ","123123")

1

> Mdb.getCollectionNames()

[ "admin","system.indexes", "system.users", "test" ]

 

下面的连接方法也是可以的

Mdb =connect("localhost:9019/admin","linger ","123123")

 

方法3文件脚本式

mongo < test.js

test.js文件内容

Master=new Mongo("localhost:9019")

Mdb=Master.getDB("admin")

Mdb.auth("linger","123123")

Mdb.getCollectionNames()

这里用了输入重定向的方法。

官网还介绍了一个执行js的方法,

mongo localhost:27017/test myjsfile.js

但是我感觉这样不够灵活,因为连接的主机ip和端口还有dbName写在命令里面。

交互式的方法,更像操作mysql那样。

脚本式的方法,更像编程语言那样。

 

交互式和脚本式一些命令的对照

技术分享

http://docs.mongodb.org/manual/tutorial/write-scripts-for-the-mongo-shell/#mongo-shell-new-connections

 

简单谈谈增删改读

mongodb以json格式处理数据的,

比如插入数据

db.testTable.insert({user:”linger”,”age”,”24”})

查询数据

db.testData.find({user:"linger"})

 

关于增删改读的详细数据可以参考一下数据

增删改读教程

http://docs.mongodb.org/manual/applications/crud/

增删改读API参考手册

http://docs.mongodb.org/manual/reference/method/

 

应用开发中mongodb的使用

Shell的方式操作mongodb,我觉得主要是管理mongodb的,这种方式做不了应用开发。

做应用开发时,我们得需要某种编程语言,然后通过mongodb的驱动来调用mongodb相关接口。

官网对驱动的描述是这样子的

An application communicates with MongoDB by wayof a client library, called a driver, that handles all interaction with the database in alanguage appropriate to the application.

http://docs.mongodb.org/manual/applications/drivers/

简单来说就是,应用通过驱动跟mongodb交互。

驱动有官方提供的,也有第三方自己开发的。

下面这张图是各语言对应的驱动

技术分享

网上意外发现云风大哥竟然自己开发了一套lua驱动。开始他想在C Drive做一层封装,给lua调用,后来又从协议层实现了一份。我简单浏览了一下代码,协议层是用C写的,直接调用windows socket与server通信,封装好最基本的api,然后lua再调用C封装成各种功能。

 

下面这段话来自他博客

我曾经想在 C Driver 的基础上做封装。做的过程中发现 c driver 代码质量不高,且特性支持不完整,最终我考虑自己从协议层开始重新做一份。

mongo 的文档不算完整,我感觉协议定义也不是很严谨。所以在实现过程中遇到许多麻烦。原本认为一天能写完的,结果做了三天。今天终于可以发布一个初步的版本了。

MongoDB 的 Lua Driver

http://blog.codingnow.com/2013/06/mongodb_lua_driver.html

http://blog.codingnow.com/2013/06/lua_mongo.html

https://github.com/cloudwu/lua-mongo

 

可以将mongodb当做hadoop的输入输出

MongoDB Connector for Hadoop

The MongoDB Connector for Hadoop is aplugin for Hadoop

that provides the ability to use MongoDB asan input source and/or an output destination.

http://docs.mongodb.org/ecosystem/tools/hadoop/

 

 

关于主从分离

Mongodb可以做主从的集群,主叫primary或者master,从叫secondary或者slave。

 

值得注意的是secondary默认是不可读写的。

当时我连接了一台secondary,想查但是出错了。

Wed Dec 24 18:50:04.670 error: {"$err" : "not master and slaveOk=false", "code" :13435 } at src/mongo/shell/query.js:128

 

有两种方法实现从机的查询:

第一种方法:db.getMongo().setSlaveOk();

第二种方法:rs.slaveOk();

 

对于replica set 中的secondary 节点默认是不可读的。

在写多读少的应用中,使用Replica Sets来实现读写分离。

通过在连接时指定或者在主库指定slaveOk,

由Secondary来分担读的压力,

Primary只承担写操作。

http://wengzhijuan12.blog.163.com/blog/static/3622414520137104257376/

让mongodb的secondary支持读操作


技术分享

Replication is the process of synchronizingdata across multiple servers.http://docs.mongodb.org/manual/core/replication-introduction/

Replication用来同步各server数据,可以用来做主从分离。

 

关于Sharding 

Sharding is a method for storing data acrossmultiple machines. MongoDB uses sharding to support deployments with very largedata sets and high throughput operations.

http://docs.mongodb.org/manual/core/sharding-introduction/

简单来说,就是Sharding是在多台机器存储数据,起扩容的作用。


技术分享


关于用户权限

管理员身份新添加的db,

管理员身份也是直接登录不了的,

得先登录到其他db,

再用use命令来切换到刚才的添加db。

如果想直接登录,要额外添加用户并授权。

因此,我觉得用户和密码是对具体的一个db来说的,而不是对mongodb来说的。

 

给数据库recsys添加一个用户linger,并添加读写权限。

db.addUser({user:"linger",pwd:"09388296",roles:["readWrite"]})


此处参考

http://docs.mongodb.org/manual/reference/method/db.addUser/#db.addUser

 


额外参考资料:

MongoDB Scripting

http://docs.mongodb.org/manual/administration/scripting/

 


本文链接:http://blog.csdn.net/lingerlanlan/article/details/42150611

本文作者:linger



Mongodb杂谈(一)