日期:2014-05-16  浏览次数:20416 次

java操作mongodb(一)之新增、查询

1、基于官方mongo-java-driver.2.9.1,在项目中pom依赖

<dependency>
	<groupId>org.mongodb</groupId>
	<artifactId>mongo-java-driver</artifactId>
	<version>2.9.1</version>
</dependency>

?2、mongodb启动

在win7-32中

mongod.exe --help
mongod.exe  --dbpath D:\mongodb\data\db --auth -logpath  D:\mongodb\log.log

?这里指定了数据库位置,--auth设置权限,这样访问mongo的所有数据库就需要授权才能访问。下面对数据库(sample)设置用户权限,在mongodb的shell中:

1、mongo.exe
2、use sample;
3、show collections;
system.indexes
system.users
user
4、db.addUser('sa','sa')
5、show collections;
Fri Oct 26 11:33:53 uncaught exception: error: {
	"$err" : "unauthorized db:sample lock type:-1 client:127.0.0.1",
	"code" : 10057
}
6、db.auth('sa','sa')
7、show collections;
system.indexes
system.users
user

?3、几个基本概念
这里借鉴熟知的jdbc链接的步骤,我们可以用如下的步骤来:

//1、建立连接
Mongo mongo = new Mongo("127.0.0.1", 27017);
//2、获取文档(数据库),这里为sample
DB db = mongo.getDB("sample");
//3、验证用户
if (db.authenticate("sa", "sa".toCharArray())) {
	//4、获取连接,这里是对集合user的操作
	DBCollection collection = db.getCollection("user");
	//对集合(表)进行各种操作(增删改查)
	DBObject obj = collection.findOne()
}?

以上的过程就类似我们建立一个jdbc的链接,其中与DriverManager、Connection、Statement 、ResultSet等很类似。
对在第二部中的安全设置是在shell中完成的,这里在DB中同样提供了对数据库操作的API:

?

DB db = mongo.getDB("sample");
db.addUser("sa", "sa".toCharArray());

?

4、基本操作

对集合的操作主要是在DBCollection中,提供了一系列增删改查抽象或方法。下面来依次来看看这些方法的使用。

4、1插入

这里主要采用insert的几种多态接口,提供了对单个或批量的支持,同时也支持插入策略限定(WriteConcern)

其中
DBObject是一个key-value的map对应保存数据库的数据
WriteConcern是控制写入策略,主要有三个方面的参数
public WriteConcern( int w , int wtimeout , boolean fsync ){
        this(w, wtimeout, fsync, false);
    }
w
-1 = don't even report network errors
0 = default, don't call getLastError by default
1 = basic, call getLastError, but don't wait for slaves
2+= wait for slaves

wtimeout how long to wait for slaves before failing
0 = indefinite
>0 = ms to wait

fsync  force fsync to disk
?我们以插入以下内容为例:
{"name" : "mongo" , "type" : "db" , "info" : { "comp" : "10gen" , "driver" : "java"}}
采用BasicDBObject封装插入数据,继承自DBObject,支持多种数据格式
//用BasicDBObject作为插入的封装数据
BasicDBObject user = new BasicDBObject();
user.put("name", "mongo");
user.put("type", "DB");

//这里是子对象
BasicDBObject info = new BasicDBObject();
info.put("comp", "10gen");
info.put("driver", "java");

user.put("info", info);

collection.insert(user);

采用BasicDBObjectBuilder

        BasicDBObjectBuilder builder = BasicDBObjectBuilder.start().add("name", "mongo").add("type", "DB");
        BasicDBObjectBuilder info = BasicDBObjectBuilder.start().add("comp", "10gen").add("driver", "java");
        builder.add("info", info.get());
        collection.insert(builder.get());

?同样也支持Map,用法与上面的一致。?对批量的支持也一样,传入List或DBObeject数组即可,如:

WriteResult result = collection.insert(list, WriteConcern.SAFE);

?这里是否返回插入错误信息依赖插入的策略WriteConcern.SAFE

?

4、2查找

更新一系列方法与插入类似,接受DBObject根据查询条件返回DBObject(单个)或DBCursor(多个)

下面是一些常用的api:

//查找一个,当然返回任意一个没多大实际意义
DBObject obj = collection.findOne();
//查找一个:name=mongo
DBObject obj = collection.findOne(new BasicDBObject("name", "mongo"));
//查找多个:满足name=mongo的所有结果集
DBCursor cursor = collection.find(new BasicDBObject("name