初试MongoDB

1.MongoDB数据库简介

2.MongoDB安装

3.MongoDB控制台简介

4. 如何向数据库插入数据?

5. 如何查询数据库?

6. java操作数据库示例

7. 代码下载

1.MongoDB数据库简介

分布式的CAP理论告诉我们,一个分布式系统不可能同时满足一致性,可用性和分区容错性,最多只能满足其中的两个。关系型数据库通过把更新操作写到事务型日志里实现了部分耐用性,但带来的是写性能的下降。MongoDB(不仅仅sql)数据库通过降低一些特性来达到高性能的需求。MongoDB取自“humongous”,是一种开源文档数据库。MongoDB是一种面向集合(collection)的,模式*的数据库。

通过和常规的sql数据库(sql server,oracle等)的比较来认识nosql数据库的一些概念。MongoDB中同样包含数据库的概念,数据库之下是称之为collection的集合对象,collection对象大致上类似于传统数据库中的表,collection之下就是“文档对象”,大致上相反与传统数据库的record。但是需要注意的是数据库和collections集合的创建都是lazy的,也就是说只有在向集合中实际插入数据时,集合和数据库文件才真正创建。

初试MongoDB

2.MongoDB安装

我是用的测试平台环境如下:

1. vmware虚拟机

2. ubuntu 10.04

MongoDB在ubuntu下的安装还是比较简单的。命令如下:

[email protected]:~/mongodb$ curl http://downloads.mongodb.org/linux/mongodb-linux-i686-1.6.4.tgz > mongo.tgz
xuqiang[email protected]:~/mongodb$ tar xzf mongo.tgz

进入刚刚解压的目录中:

[email protected]:~/mongodb$ cd mongodb-linux-i686-1.6.4/

该目录下文件如下:

[email protected]:~/mongodb/mongodb-linux-i686-1.6.4$ ls
bin GNU-AGPL-3.0 README THIRD-PARTY-NOTICES

下面开始设置数据库文件存储文件夹。默认会在/data/db/存储数据库文件,所以首先建立该目录:

[email protected]:~$ sudo mkdir -p /data/db/

改变该目录的权限:

[email protected]:~$ sudo chown `id -u` /data/db

准备好文件目录之后,启动服务器,进入bin目录下:

[email protected]:~/mongodb/mongodb-linux-i686-1.6.4$ cd bin
[email protected]:~/mongodb/mongodb-linux-i686-1.6.4/bin$ ls
bsondump mongod mongoexport mongoimport mongos mongostat
mongo mongodump mongofiles mongorestore mongosniff
使用超级用户启动服务器:

[email protected]:~/mongodb/mongodb-linux-i686-1.6.4/bin$ sudo ./mongod

mongod mongodump
[email protected]:~/mongodb/mongodb-linux-i686-1.6.4/bin$ sudo ./mongod

输出如下:

./mongod --help for help and startup options

Sun Mar 27 04:26:17 MongoDB starting : pid=6289 port=27017dbpath=/data/db/32-bit
** NOTE: when using MongoDB 32 bit, you are limited to about 2 gigabytes of data
** see http://blog.mongodb.org/post/137788967/32-bit-limitations
Sun Mar 27 04:26:17 db version v1.6.4, pdfile version 4.5
Sun Mar 27 04:26:17 git version: 4f5c02f8d92ff213b71b88f5eb643b7f62b50abc
Sun Mar 27 04:26:17 sys info: Linux domU-12-31-39-01-70-B4 2.6.21.7-2.fc8xen #1 SMP Fri Feb 15 12:39:36 EST 2008 i686 BOOST_LIB_VERSION=1_37
Sun Mar 27 04:26:17 [initandlisten] waiting for connections on port 27017
Sun Mar 27 04:26:18 [websvr] web admin interface listening on port 28017

通过上面的查看可以看到当前服务器在27017端口上监听,同时数据库文件是存储在/data/db/下的。当然如果不想在命令行键入文件的全路径,可以将上面的路径添加到环境变量中,或者是将这几个bin下的文件全部拷贝到/usr/bin/下。服务器启动起来之后,我们来启动客户端程序:

重新打开一个bash console,命令:

[email protected]:~/mongodb$ mongo

输出:

MongoDB shell version: 1.6.4

connecting to: test
>
到目前服务器已经启动起来,同时我们通过客户端和服务器端成功连接。呵呵,是不是比较激动,下面是一个简单的测试:

> db.foo.save( { a : 2 } );

> db.foo.find();
{ "_id" : ObjectId("4d8f216819225380327a66ae"), "a" : 2 }

需要注意的是foo集合如果test数据库中不存在,那么将自动创建。

3.MongoDB控制台简介

MongoDB采用的javascript式的交互控制台,可以从中直接操作数据库。在其中键入help可以查看常见的帮助主题,然后进入具体的帮助主题中。通过help命令能够对MongoDB命令行有个初步认识。js的控制台中有命令记忆的功能,可以通过上下箭头来查看先前键入的命令。

> help

db.help() help on db methods
db.mycoll.help() help on collection methods
rs.help() help on replica set methods
help connect connecting to a db help
help admin administrative help
help misc misc things to know
show dbs show database names
show collections show collections in current database
show users show users in current database
show profile show most recent system.profile entries with time>= 1ms
use <db_name> set current database
db.foo.find() list objects in collection foo
db.foo.find( { a : 1 } ) list objects in foo where a == 1
it result of the last line evaluated; use to furtheriterate
exit quit the mongo shell

4. 如何向数据库中插入数据

下面的测试是在mydb中进行,首先进行数据库切换:

> use mydb

switched to db mydb

4.1 插入命令结构如下:

初试MongoDB

4.2 示例 (http://www.mongodb.org/display/DOCS/Tutorial#):

> j = { name : "mongo" };
{"name" : "mongo"}
> t = { x : 3 };
{ "x" : 3 }
> db.things.save(j);
> db.things.save(t);
> db.things.find();
{ "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" }
{ "_id" : ObjectId("4c2209fef3924d31102bd84b"), "x" : 3 }

5. 如何查询数据库 ?

5.1 查询基本结构:

初试MongoDB

5.2 使用游标?

> var cursor = db.things.find();

> while (cursor.hasNext()) printjson(cursor.next());

其中printjson是内置函数。

5.3 如何增加查询条件?

> db.things.find({name:"mongo"}).forEach(printjson);
{ "_id" : ObjectId("4d8de0a325a9112df63a8c62"), "name" : "mongo" }

上面的查询等价的sql如下:

SELECT * FROM things WHERE name="mongo"

5.4 如何仅仅返回特定的列?

> db.things.find({x:4}, {j:true}).forEach(printjson);
{ "_id" : ObjectId("4d8de13a25a9112df63a8c64"), "j" : 0 }

显然上面仅仅返回了j这一列。

5.5 如何限制返回查询的条目数量(分页中使用)?

> db.things.find().limit(3);
{ "_id" : ObjectId("4d8de0a325a9112df63a8c62"), "name" : "mongo" }
{ "_id" : ObjectId("4d8de0c625a9112df63a8c63"), "x" : 3 }
{ "_id" : ObjectId("4d8de13a25a9112df63a8c64"), "x" : 4, "j" : 0 }

6.java操作数据库示例?


import java.util.Set;

import com.mongodb.DB;
import com.mongodb.Mongo;
import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.DBCursor;
public class QuickTour {
public static void main(String[] args) {
try {
System.out.println("connect to server ...");
// server, port
Mongo m = new Mongo( "localhost" , 27017 );
DB db = m.getDB( "mydb" );
// get the collections
Set<String> colls = db.getCollectionNames();
for (String s : colls) {
System.out.println(s);
}
// insert into the db
// make a new collection
DBCollection coll = db.getCollection("testCollection");
BasicDBObject doc = new BasicDBObject();
doc.put("name", "MongoDB");
doc.put("type", "database");
doc.put("count", 1);
coll.insert(doc);
// search db
DBObject myDoc = coll.findOne();
System.out.println(myDoc);
// use cursor to retrive data
DBCursor cur = coll.find();
while(cur.hasNext()) {
System.out.println(cur.next());
}
}
catch(Exception e) {
System.out.println(e.toString());
}
}
}

7. 代码下载

/Files/xuqiang/nosql/MongoDBTest.rar