网上看见一篇博文,详细讲了MongoDB读写策略,将来生产会遇到类似的问题,转来备查。
指定新mongo实例:
Mongo m = new Mongo();
Mongo m = new Mongo( "localhost" );
Mongo m = new Mongo( "localhost" , 27017 );
// or, to connect to a replica set, supply a seed list of members
Mongo m = new Mongo(Arrays.asList(new ServerAddress("localhost", 27017),
new ServerAddress("localhost", 27018),
new ServerAddress("localhost", 27019)));
然后发起连接(必须指定数据库名,可以不存在)
DB db = m.getDB( "mydb" );
注意Mongo已经实现了连接池,并且是线程安全的。
大部分用户使用mongodb都在安全内网下,但如果将mongodb设为安全验证模式,就需要在客户端提供用户名和密码:
boolean auth = db.authenticate(myUserName, myPassword);
获取集合(collection)的名称列表(类似show databases):
Set colls = db.getCollectionNames();
获取一个集合(以便增删改查操作):
DBCollection coll = db.getCollection("testCollection")
-------------------------------------------------------------
先假设要插入的json数据如下:
{
"name" : "MongoDB",
"type" : "database",
"count" : 1,
"info" : {
x : 203,
y : 102
}
}
将其插入数据库:
BasicDBObject doc = new BasicDBObject();
doc.put("name", "MongoDB");
doc.put("type", "database");
doc.put("count", 1);
BasicDBObject info = new BasicDBObject();
info.put("x", 203);
info.put("y", 102);
doc.put("info", info);
coll.insert(doc);
-------------------------------------------------------------
设定write concern,以便操作失败时得到提示:
m.setWriteConcern(WriteConcern.SAFE);
-------------------------------------------------------------
查找一个/第一个记录:
DBObject myDoc = coll.findOne();
System.out.println(myDoc);
注意:属性名不能以下划线或者美元符号开始,mongodb自己保留。
获取总记录数:
System.out.println(coll.getCount());
使用游标操作查询结果:
DBCursor cursor = coll.find();
try {
while(cursor.hasNext()) {
System.out.println(cursor.next());
}
} finally {
cursor.close();
}
条件查询:
BasicDBObject query = new BasicDBObject();
query.put("i", 71);
cursor = coll.find(query);
try {
while(cursor.hasNext()) {
System.out.println(cursor.next());
}
} finally {
cursor.close();
}
如果想使用shell里的类似以下语句的功能:
db.things.find({j: {$ne: 3}, k: {$gt: 10} });
在java驱动里,{$ne: 3}也是一个普通的DBObject:
BasicDBObject query = new BasicDBObject();
query.put("j", new BasicDBObject("$ne", 3));
query.put("k", new BasicDBObject("$gt", 10));
cursor = coll.find(query);
try {
while(cursor.hasNext()) {
System.out.println(cursor.next());
}
} finally {
cursor.close();
}
条件查询一批数据:
以下是查询i > 50的记录:
query = new BasicDBObject();
query.put("i", new BasicDBObject("$gt