Mongodb 是最近很流行的NO sql DB。非关系型数据库的典型。非常适合厌倦了SQL 的你。
不废话,开始
1 上官网 http://www.mongodb.org/
这个是我xp使用的Windows 32位 版本,限制是DB只能使用2G
http://downloads.mongodb.org/win32/mongodb-win32-i386-2.0.1.zip
自己下载,解压
2 打开 bin目录,例如我的:
C:\soft\mongodb-win32-i386-2.0.0\bin
让我们建立一个启动的脚本(bat)吧,免得每次都命令:
mongod.exe --journal -dbpath C:\soft\mongodb-win32-i386-2.0.0\db
mongod.exe是服务器程序
mongo.exe 是 admin console
--journal 持续运行
-dbpath C:\soft\mongodb-win32-i386-2.0.0\db 指定db存放的目录
运行这个 脚本。
控制台显示:
C:\soft\mongodb-win32-i386-2.0.0\bin>mongod.exe --journal -dbpath C:\soft\mongod b-win32-i386-2.0.0\db Mon Oct 24 18:12:29 [initandlisten] MongoDB starting : pid=6100 port=27017 dbpat h=C:\soft\mongodb-win32-i386-2.0.0\db 32-bit host=xxx Mon Oct 24 18:12:29 [initandlisten] Mon Oct 24 18:12:29 [initandlisten] ** NOTE: when using MongoDB 32 bit, you are limited to about 2 gigabytes of data Mon Oct 24 18:12:29 [initandlisten] ** see http://blog.mongodb.org/post/13 7788967/32-bit-limitations Mon Oct 24 18:12:29 [initandlisten] ** with --journal, the limit is lower Mon Oct 24 18:12:29 [initandlisten] Mon Oct 24 18:12:29 [initandlisten] db version v2.0.0, pdfile version 4.5 Mon Oct 24 18:12:29 [initandlisten] git version: 695c67dff0ffc361b8568a13366f027 caa406222 Mon Oct 24 18:12:29 [initandlisten] build info: windows (5, 1, 2600, 2, 'Service Pack 3') BOOST_LIB_VERSION=1_42 Mon Oct 24 18:12:29 [initandlisten] options: { dbpath: "C:\soft\mongodb-win32-i3 86-2.0.0\db", journal: true } Mon Oct 24 18:12:29 [initandlisten] journal dir=C:/soft/mongodb-win32-i386-2.0.0 /db/journal Mon Oct 24 18:12:29 [initandlisten] recover : no journal files present, no recov ery needed Mon Oct 24 18:12:29 [websvr] admin web console waiting for connections on port 2 8017 Mon Oct 24 18:12:29 [initandlisten] waiting for connections on port 27017
显示
You are trying to access MongoDB on the native driver port. For http diagnostic access, add 1000 to the port number
就说明你运行成功了。
3 提供一下用到的POJO:
import org.bson.types.ObjectId;
import com.google.code.morphia.annotations.Embedded;
import com.google.code.morphia.annotations.Entity;
import com.google.code.morphia.annotations.Id;
@Entity
public class Hotel {
@Id
private ObjectId id;
private String name;
private int stars;
@Embedded
private Address address;
public ObjectId getId() {
return id;
}
public void setId(ObjectId id) {
this.id = id;
}
// ... getters and setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getStars() {
return stars;
}
public void setStars(int stars) {
this.stars = stars;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
import com.google.code.morphia.annotations.Embedded;
@Embedded
public class Address {
private String street;
private String city;
private String postCode;
private String country; // ... getters and setters
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getPostCode() {
return postCode;
}
public void setPostCode(String postCode) {
this.postCode = postCode;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
}
4 需要下载数据库的java 驱动
http://github.com/mongodb/mongo-java-driver/downloads
需要参考的驱动API
5 example
这个是单纯MoongoDb 支持的 API 操作,不解释。这是直接操作DB
还没有完成ORM操作。上代码。
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.junit.Before;
import org.junit.Test;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import com.mongodb.MongoException;
public class MongoTest {
public static void main(String[] args) {
}
private Mongo m;
private DB db;
@Before
public void init() {
try {
// new a Mongo Object ,entrance for accessing MongoDb
this.m = new Mongo("localhost");
System.out.println(m.debugString());
// // select a DB
// // The database doesn't have to exist - if it doesn't, MongoDB
// will create it for you.
this.db = m.getDB("test");
System.out.println("DB [" + db.getName() + "] Connected");
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MongoException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test
public void testCases() {
// TODO Auto-generated method stub
testFindAlltestFindAllCollections();
insertFindAllRemove();
insertFindOneRemove();
insertAndQuery();
createIndex();
;
}
private void createIndex() {
insertRecords();
// MongoDB supports indexes, and they are very easy to add on a
// collection. To create an index, you just specify the field that
// should be indexed, and specify if you want the index to be ascending
// (1) or descending (-1). The following creates an ascending index on
// the "i" field :
DBCollection dbconn = db.getCollection("things");
dbconn.createIndex(new BasicDBObject("case", -1)); // create index on "i",
// ascending
Iterator<DBObject> iter= dbconn.getIndexInfo().iterator();
while (iter.hasNext()) {
DBObject dbObject = (DBObject) iter.next();
System.out.println("Index Info:"+dbObject);;
}
removeAll();
}
private void insertAndQuery() {
insertRecords();
query();
removeAll();
}
private void query() {
System.out.println("start query");
DBCollection dbconn = db.getCollection("things");
// looks like find by example
BasicDBObject queryDb = new BasicDBObject();
queryDb.append("case", 5);
DBCursor dbc = dbconn.find(queryDb);
while (dbc.hasNext()) {
DBObject dbObject = (DBObject) dbc.next();
System.out.println("result case=5:" + dbObject);
}
System.out.println("end query");
// find in range
BasicDBObject query = new BasicDBObject();
query.put("case", new BasicDBObject("$gt", 5)); // e.g. find all where
// case > 5
DBCursor cur = dbconn.find(query);
while (cur.hasNext()) {
System.out.println("case >5:" + cur.next());
}
}
private void insertFindOneRemove() {
insertRecords();
testFindOneInCollections();
removeAll();
}
private void testFindOneInCollections() {
System.out.println("Collections Find one:");
DBCollection dbconn = db.getCollection("things");
// declare that just one object is needed,null if none
System.out.println(dbconn.findOne());
;
System.out.println("Collections Find one end");
}
private void insertFindAllRemove() {
insertRecords();
testFindAllInCollections();
removeAll();
}
private void removeAll() {
System.out.println("start remove all");
DBCollection dbconn = db.getCollection("things");
DBCursor c = dbconn.find();
while (c.hasNext()) {
dbconn.remove(c.next());
}
System.out.println("done");
}
public void testFindAlltestFindAllCollections() {
System.out.println("Collections :");
Set<String> colls = db.getCollectionNames();
for (String s : colls) {
System.out.print(s);
System.out.print(",");
}
System.out.println();
}
public void insertRecords() {
System.out.println("start insert :");
DBCollection dbconn = db.getCollection("things");
for (int i = 0; i < 10L; i++) {
// BasicDBObject basic=new BasicDBObject();
//
// basic.append("time",System.currentTimeMillis());
//
// basic.append("obj",i);
// dbconn.save(basic);
BasicDBObject doc = new BasicDBObject();
doc.put("case", i);
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);
dbconn.insert(doc);
}
System.out.println("Insert End");
}
public void testFindAllInCollections() {
System.out.println("Data in 'things':");
// Select a Collection ,Collection looks like a Table of RMDBS
DBCollection coll = db.getCollection("things");
// find all and print
DBCursor c = coll.find();
while (c.hasNext()) {
System.out.println(c.next());
}
}
}
输出结果:
DBTCPConnector: localhost:27017 A1569XDZXLJM8W6/133.4.0.85:27017
DB [test] Connected
Collections :
system.indexes,things,
start insert :
Insert End
Data in 'things':
{ "_id" : { "$oid" : "4eb75882ba4d4fab62ee4cfb"} , "case" : 0 , "name" : "MongoDB" , "type" : "database" , "count" : 1 , "info" : { "x" : 203 , "y" : 102}}
{ "_id" : { "$oid" : "4eb75882ba4d4fab62ee4cfc"} , "case" : 1 , "name" : "MongoDB" , "type" : "database" , "count" : 1 , "info" : { "x" : 203 , "y" : 102}}
{ "_id" : { "$oid" : "4eb75882ba4d4fab62ee4cfd"} , "case" : 2 , "name" : "MongoDB" , "type" : "database" , "count" : 1 , "info" : { "x" : 203 , "y" : 102}}
{ "_id" : { "$oid" : "4eb75882ba4d4fab62ee4cfe"} , "case" : 3 , "name" : "MongoDB" , "type" : "database" , "count" : 1 , "info" : { "x" : 203 , "y" : 102}}
{ "_id" : { "$oid" : "4eb75882ba4d4fab62ee4cff"} , "case" : 4 , "name" : "MongoDB" , "type" : "database" , "count" : 1 , "info" : { "x" : 203 , "y" : 102}}
{ "_id" : { "$oid" : "4eb75882ba4d4fab62ee4d00"} , "case" : 5 , "name" : "MongoDB" , "type" : "database" , "count" : 1 , "info" : { "x" : 203 , "y" : 102}}
{ "_id" : { "$oid" : "4eb75882ba4d4fab62ee4d01"} , "case" : 6 , "name" : "MongoDB" , "type" : "database" , "count" : 1 , "info" : { "x" : 203 , "y" : 102}}
{ "_id" : { "$oid" : "4eb75882ba4d4fab62ee4d02"} , "case" : 7 , "name" : "MongoDB" , "type" : "database" , "count" : 1 , "info" : { "x" : 203 , "y" : 102}}
{ "_id" : { "$oid" : "4eb75882ba4d4fab62ee4d03"} , "case" : 8 , "name" : "MongoDB" , "type" : "database" , "count" : 1 , "info" : { "x" : 203 , "y" : 102}}
{ "_id" : { "$oid" : "4eb75882ba4d4fab62ee4d04"} , "case" : 9 , "name" : "MongoDB" , "type" : "database" , "count" : 1 , "info" : { "x" : 203 , "y" : 102}}
start remove all
done
start insert :
Insert End
Collections Find one:
{ "_id" : { "$oid" : "4eb75882ba4d4fab62ee4d05"} , "case" : 0 , "name" : "MongoDB" , "type" : "database" , "count" : 1 , "info" : { "x" : 203 , "y" : 102}}
Collections Find one end
start remove all
done
start insert :
Insert End
start query
result case=5:{ "_id" : { "$oid" : "4eb75882ba4d4fab62ee4d14"} , "case" : 5 , "name" : "MongoDB" , "type" : "database" , "count" : 1 , "info" : { "x" : 203 , "y" : 102}}
end query
case >5:{ "_id" : { "$oid" : "4eb75882ba4d4fab62ee4d15"} , "case" : 6 , "name" : "MongoDB" , "type" : "database" , "count" : 1 , "info" : { "x" : 203 , "y" : 102}}
case >5:{ "_id" : { "$oid" : "4eb75882ba4d4fab62ee4d16"} , "case" : 7 , "name" : "MongoDB" , "type" : "database" , "count" : 1 , "info" : { "x" : 203 , "y" : 102}}
case >5:{ "_id" : { "$oid" : "4eb75882ba4d4fab62ee4d17"} , "case" : 8 , "name" : "MongoDB" , "type" : "database" , "count" : 1 , "info" : { "x" : 203 , "y" : 102}}
case >5:{ "_id" : { "$oid" : "4eb75882ba4d4fab62ee4d18"} , "case" : 9 , "name" : "MongoDB" , "type" : "database" , "count" : 1 , "info" : { "x" : 203 , "y" : 102}}
start remove all
done
start insert :
Insert End
Index Info:{ "v" : 1 , "key" : { "_id" : 1} , "ns" : "test.things" , "name" : "_id_"}
Index Info:{ "v" : 1 , "key" : { "case" : 1} , "ns" : "test.things" , "name" : "case_1"}
Index Info:{ "v" : 1 , "key" : { "case" : -1} , "ns" : "test.things" , "name" : "case_-1"}
start remove all
done
6 Morphia
Java的OOP特性,决定Java使用mongo的时候无可避免的要使用到ORM特性。
Morphia 是当前几个支持MongoDb ORm的比较好用的一个。
项目地址 http://code.google.com/p/morphia/
下载地址 暂时最高版本 0.98
http://code.google.com/p/morphia/downloads/list
不废话,上Sample
import java.net.UnknownHostException;
import com.google.code.morphia.Datastore;
import com.google.code.morphia.Morphia;
import com.google.code.morphia.query.Query;
import com.google.code.morphia.query.UpdateOperations;
import com.mongodb.DB;
import com.mongodb.Mongo;
import com.mongodb.MongoException;
public class MorphiaTest {
// main
//
public static void main(String[] args) {
try {
Mongo m = new Mongo("localhost");
DB db = m.getDB("test");
Morphia morphia = new Morphia();
morphia.map(Hotel.class).map(Address.class);
Datastore ds = morphia.createDatastore(m, "test");
Hotel hotel = new Hotel();
hotel.setName("My Hotel123");
// hotel.setId(new ObjectId("4ea510c8b24d395248f1f97f"));
hotel.setStars(90);
Address address = new Address();
address.setStreet("123 Some street");
address.setCity("Some city");
address.setPostCode("123 456");
address.setCountry("2Some country");
// set address
hotel.setAddress(address);
// Save the POJO
ds.save(hotel);
// System.out.println(ds.find(Hotel.class, "stars >", 3));
Query q = ds.createQuery(Hotel.class).disableValidation()
.disableValidation();
System.out.println(q.filter("id =", "4eb79c8cba4d913746120ae9").asList());
// delete POJO
ds.delete(q);
// update operation
ds.save(hotel);
UpdateOperations<Hotel> ops = ds.createUpdateOperations(
Hotel.class).set("name", "New Name1");
ds.update(q, ops);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MongoException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
利用 Morphia 可以使用Mongo DB,集成到项目 的DAO
里面。最小成本地使用Nosql技术,满足实际的项目需求。
本文大多使用原官网的code作为例子。只作为入门参考,即使这不是一个很好的教程。