上兩篇文章: http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html
http://www.cnblogs.com/hoojo/archive/2011/06/02/2068665.html
介紹到了在MongoDB的控制臺完成MongoDB的數(shù)據(jù)操作、以及通過Java MongoDB 的驅(qū)動完成在Java中對MongoDB的操作,通過前兩篇文章我們對MongoDB有了全面、深刻的認(rèn)識和理解。現(xiàn)在我們就看看利用Morphia庫來操作MongoDB。
開發(fā)環(huán)境:
System:Windows
IDE:eclipse、MyEclipse 8
Database:mongoDB
開發(fā)依賴庫:
JavaEE5、mongo-2.5.3.jar、junit-4.8.2.jar
Email:hoojo_@126.com
Blog: http://blog.csdn.net/IBM_hoojo
一、準(zhǔn)備工作
1、 首先,下載mongoDB對Java支持的驅(qū)動包
驅(qū)動包下載地址: https://github.com/mongodb/mongo-java-driver/downloads
mongoDB對Java的相關(guān)支持、技術(shù): http://www.mongodb.org/display/DOCS/Java+Language+Center
驅(qū)動源碼下載: https://download.github.com/mongodb-mongo-java-driver-r2.6.1-7-g6037357.zip
在線查看源碼: https://github.com/mongodb/mongo-java-driver
Morphia jar包下載: http://code.google.com/p/morphia/downloads/list
2、 下面建立一個(gè)JavaProject工程,導(dǎo)入下載下來的驅(qū)動包。即可在Java中使用Morphia,目錄如下:
二、Java操作MongoDB示例
在本示例之前你需要啟動mongod.exe的服務(wù),在你安裝mongoDB的目錄中,找到mongod.exe啟動服務(wù)后,下面的程序才能順利執(zhí)行;
1、 Java操作mongoDB數(shù)據(jù)庫,操作索引
Mongo mongo = new Mongo();
這樣就創(chuàng)建了一個(gè)MongoDB的數(shù)據(jù)庫連接對象,它默認(rèn)連接到當(dāng)前機(jī)器的localhost地址,端口是27017。
DB db = mongo.getDB(“test”);
這樣就獲得了一個(gè)test的數(shù)據(jù)庫,如果mongoDB中沒有創(chuàng)建這個(gè)數(shù)據(jù)庫也是可以正常運(yùn)行的。如果你 讀過上一篇文章 就知道,mongoDB可以在沒有創(chuàng)建這個(gè)數(shù)據(jù)庫的情況下,完成數(shù)據(jù)的添加操作。當(dāng)添加的時(shí)候,沒有這個(gè)庫,mongoDB會自動創(chuàng)建當(dāng)前數(shù)據(jù)庫。
得到了db,下一步我們要獲取一個(gè)“聚集集合DBCollection”,通過db對象的getCollection方法來完成。
DBCollection users = db.getCollection("users");
這樣就獲得了一個(gè)DBCollection,它相當(dāng)于我們數(shù)據(jù)庫的“表”。
查詢所有數(shù)據(jù)
DBCursor cur = users.find();
while (cur.hasNext()) {
System.out.println(cur.next());
}
用BasicDBObjectBuilder,向users對象中添加數(shù)據(jù)
user = BasicDBObjectBuilder. start ("id", 1546555)
.append("name", "jojo").add("address", "gz")
.append("email", "hoojo_@126.com")
.get();
插入數(shù)據(jù)
users.insert(user);
可以利用JSON工具來序列化對象數(shù)據(jù)
JSON. serialize (cur)
完整源碼
package
com.hoo.test;
?
import
java.net.UnknownHostException;
import
com.hoo.entity.User;
import
com.hoo.util.BasicDBObjectUtils;
import
com.mongodb.BasicDBObjectBuilder;
import
com.mongodb.DB;
import
com.mongodb.DBCollection;
import
com.mongodb.DBCursor;
import
com.mongodb.DBObject;
import
com.mongodb.Mongo;
import
com.mongodb.MongoException;
import
com.mongodb.util.JSON;
?
/**
* <b>function:</b> Mongo實(shí)例對象的相關(guān)方法測試
* @author hoojo
* @createDate 2011-5-24 下午02:42:29
* @file MongoDBTest.java
* @package com.hoo.test
* @project MongoDB
* @blog http://blog.csdn.net/IBM_hoojo
* @email hoojo_@126.com
* @version 1.0
*/
public class MongoDBTest {
?
public static void main(String[] args) throws UnknownHostException, MongoException {
Mongo mg =
new
Mongo();
System.out.println(
"查詢所有的Database的名稱"
);
for
(String name : mg.getDatabaseNames()) {
System.out.println(
"dbName: "
+ name);
}
System.out.println(
"查詢test庫中的所有collection集合(表)名稱"
);
DB db = mg.getDB(
"test"
);
for
(String name : db.getCollectionNames()) {
System.out.println(
"collectionName: "
+ name);
}
System.out.println(
"添加測試數(shù)據(jù)"
);
DBCollection users = db.getCollection(
"users"
);
try
{
// 用自定義BasicDBObjectUtils工具類,將User Enity對象轉(zhuǎn)換成DBObject
DBObject user = BasicDBObjectUtils.castModel2DBObject( new User( "345567" , "jack" , 22, "beijin" ));
users.insert(user);
// 用BasicDBObjectBuilder構(gòu)建一個(gè)DBObject對象
user = BasicDBObjectBuilder.start( "id" , 1546555).append( "name" , "jojo" ).add( "address" , "gz" ).append( "email" , "hoojo_@126.com" ).get();
users.insert(user);
}
catch
(Exception e) {
e.printStackTrace();
}
System.out.println(
"游標(biāo)查詢所有users集合數(shù)據(jù)"
);
DBCursor cur = users.find();
while
(cur.hasNext()) {
System.out.println(cur.next());
}
System.out.println(
"查詢游標(biāo)相關(guān)內(nèi)容"
);
System.out.println(cur.count());
System.out.println(cur.getCursorId());
System.out.println(cur.getOptions());
System.out.println(cur.getQuery());
System.out.println(cur.getSizes().listIterator());
System.out.println(cur.itcount());
//System.out.println(cur.length());
System.out.println(cur.size());
System.out.println(cur.numGetMores());
System.out.println(cur.curr());
//System.out.println(cur.toArray().get(0));
System.out.println(
"顯示游標(biāo)查詢到的所有內(nèi)容: "
+ JSON.serialize(cur));
}
}
工具類,將帶有g(shù)etter、setter方法的Java類序列化成DBObject對象
package
com.hoo.util;
?
import
java.lang.reflect.Method;
import
com.mongodb.BasicDBObject;
import
com.mongodb.DBObject;
?
/**
* <b>function:</b> 將Entity/Model轉(zhuǎn)換成DBObject
* @author hoojo
* @createDate 2011-5-30下午01:53:08
* @file BasicDBObjectUtil.java
* @package com.hoo.util
* @project MongoDB
* @blog http://blog.csdn.net/IBM_hoojo
* @email hoojo_@126.com
* @version 1.0
*/
publicclass BasicDBObjectUtils {
public static <T> DBObject castModel2DBObject(T entity) throws Exception {
Method[] method = entity.getClass().getMethods();
DBObject dbObject =
new
BasicDBObject();
for
(Method m : method) {
//System.out.println(m.getName());
if (m.getName().startsWith( "get" )) {
String name = m.getName().replace( "get" , "" );
for
(Method m2 : method) {
if (m2.getName().equals( "set" + name)) {
name = name.substring(0, 1).toLowerCase() + name.substring(1);
Object returnVal = m.invoke(entity,
new
Object[] {});
if
(returnVal != null) {
//System.out.println(name + " : " + m.invoke(shipping, new Object[] {}));
dbObject.put(name, returnVal);
}
}
}
}
}
System.out.println(
"dbObject: "
+ dbObject);
return
dbObject;
}
}
2、 完成索引操作,首先建立一個(gè)MongoDB4IndexTest.java,基本測試代碼如下:
package
com.hoo.test;
?
import
java.net.UnknownHostException;
import
java.util.ArrayList;
import
java.util.List;
import
org.bson.types.ObjectId;
import
org.junit.After;
import
org.junit.Before;
import
org.junit.Test;
import
com.mongodb.BasicDBObject;
import
com.mongodb.Bytes;
import
com.mongodb.DB;
import
com.mongodb.DBCollection;
import
com.mongodb.DBCursor;
import
com.mongodb.DBObject;
import
com.mongodb.Mongo;
import
com.mongodb.MongoException;
import
com.mongodb.QueryOperators;
import
com.mongodb.util.JSON;
?
/**
* <b>function:</b> 實(shí)現(xiàn)MongoDB的Index操作
* @author hoojo
* @createDate 2011-6-2 下午03:21:23
* @file MongoDB4IndexTest.java
* @package com.hoo.test
* @project MongoDB
* @blog http://blog.csdn.net/IBM_hoojo
* @email hoojo_@126.com
* @version 1.0
*/
public class MongoDB4IndexTest {
private
Mongo mg = null;
private
DB db;
private
DBCollection users;
@Before
public void init() {
try
{
mg =
new
Mongo();
//mg = new Mongo("localhost", 27017);
}
catch
(UnknownHostException e) {
e.printStackTrace();
}
catch
(MongoException e) {
e.printStackTrace();
}
//獲取temp DB;如果默認(rèn)沒有創(chuàng)建,mongodb會自動創(chuàng)建
db = mg.getDB(
"temp"
);
//獲取users DBCollection;如果默認(rèn)沒有創(chuàng)建,mongodb會自動創(chuàng)建
users = db.getCollection(
"users"
);
}
@After
public void destory() {
if
(mg != null)
mg.close();
mg = null;
db = null;
users = null;
System.gc();
}
public void print(Object o) {
System.out.println(o);
}
}
3、 下面完成對象Collection的index的操作
/**
* <b>function:</b> 測試Collection的index相關(guān)操作
* @author hoojo
* @createDate 2012-2-16 下午08:32:26
*/
@Test
public void testIndex() {
query();
for
(DBObject index : coll.getIndexInfo()) {
print(
"IndexInfo: "
+ index);
}
coll.dropIndexes();
//創(chuàng)建索引
coll.createIndex( new BasicDBObject( "name" , "idx_name" ));
print(coll.findOne( new BasicDBObject( "name" , "haha" )));
coll.createIndex(coll.findOne( new BasicDBObject( "name" , "haha" )));
DBObject o = new BasicDBObject( "unique" , true);
//coll.createIndex(coll.findOne(), o);
// 修改索引,如果存在就修改不存在就添加
coll.ensureIndex(o);
coll.ensureIndex(
"age_1"
);
coll.ensureIndex( new BasicDBObject( "age3_1" , 6), new BasicDBObject( "ts" , -1));
coll.ensureIndex( new BasicDBObject( "age_2" , 1), new BasicDBObject( "ts" , 1 ));
coll.ensureIndex( new BasicDBObject( "password" , 2), new BasicDBObject( "z" , "idx" ));
coll.ensureIndex( new BasicDBObject( "password" , 1), new BasicDBObject( "etc" , "idx" ));
// 創(chuàng)建唯一索引
coll.ensureIndex( new BasicDBObject( "emial" , 2), new BasicDBObject( "unique" , false));
// 創(chuàng)建索引,指定索引名稱default_index
coll.ensureIndex( new BasicDBObject( "address" , 1), new BasicDBObject( "name" , "default_index" ));
// 創(chuàng)建索引對象,索引名稱user_index
coll.ensureIndex(coll.findOne( new BasicDBObject( "name" , "hoho" )), "user_index" );
// 唯一索引
coll.ensureIndex(coll.findOne( new BasicDBObject( "name" , "hehe" )), "users_index_unique" , true);
// 查詢所有索引
for
(DBObject index : coll.getIndexInfo()) {
print(
"IndexInfo: "
+ index);
}
print(DBCollection.genIndexName(coll.findOne()));
//coll.dropIndex(coll.findOne());
print(DBCollection.genIndexName( new BasicDBObject( "password" , 2)));
//coll.dropIndex(DBCollection.genIndexName(new BasicDBObject("password", 2)));
//coll.dropIndexes();
//coll.dropIndexes("assword_1");
}
三、Morphia基本操作
1、 morphia可以利用annotation對JavaEntity進(jìn)行注解,那樣我們就可以用morphia操作JavaEntity對象
package
com.hoo.entity;
?
import
com.google.code.morphia.annotations.Entity;
import
com.google.code.morphia.annotations.Id;
?
/**
* <b>function:</b> JavaEntity對象
* @author hoojo
* @createDate 2011-5-31上午11:45:21
* @file User.java
* @package com.hoo.entity
* @project Morphia
* @blog http://blog.csdn.net/IBM_hoojo
* @email hoojo_@126.com
* @version 1.0
*/
//利用morphia的annotation進(jìn)行注解
@Entity
public class User {
@Id
private long id;
private
String name;
private boolean sex;
private int age;
private
String address;
public
User() {
}
public User( long id, String name, boolean sex, int age, String address) {
super
();
this
.id = id;
this
.name = name;
this
.sex = sex;
this
.age = age;
this
.address = address;
}
//getter、setter
@Override
public
String toString() {
return this .id + "#" + this .name + "#" + this .age + "#" + this .sex + "#" + this .address;
}
}
2、 對Morphia對象一些簡單的使用,看看該對象提供了哪些基本的操作方法
package
com.hoo.test.morphia;
?
import
java.net.UnknownHostException;
import
org.junit.After;
import
org.junit.Before;
import
org.junit.Test;
import
com.google.code.morphia.Datastore;
import
com.google.code.morphia.EntityInterceptor;
import
com.google.code.morphia.Morphia;
import
com.google.code.morphia.mapping.MappedClass;
import
com.google.code.morphia.mapping.Mapper;
import
com.google.code.morphia.mapping.cache.EntityCache;
import
com.hoo.entity.User;
import
com.mongodb.BasicDBObjectBuilder;
import
com.mongodb.Mongo;
import
com.mongodb.MongoException;
?
/**
* <b>function:</b> morphia對象的簡單測試
* @author hoojo
* @createDate 2011-5-31上午11:30:20
* @file MorphiaTest.java
* @package com.hoo.test
* @project Morphia
* @blog http://blog.csdn.net/IBM_hoojo
* @email hoojo_@126.com
* @version 1.0
*/
public class MorphiaTest {
private
Mongo mongo;
private
Morphia morphia;
@Before
public void init() {
try
{
mongo =
new
Mongo();
}
catch
(UnknownHostException e) {
e.printStackTrace();
}
catch
(MongoException e) {
e.printStackTrace();
}
morphia =
new
Morphia();
}
private void print(Object o) {
if
(o != null) {
System.out.println(o.toString());
}
}
/**
* <b>function:</b> morphia對象的簡單測試
* @author hoojo
*/
@SuppressWarnings(
"deprecation"
)
@Test
public void testMorphia() {
// 創(chuàng)建一個(gè)Datastore,過時(shí)的方法不推薦使用
Datastore ds = morphia.createDatastore(
"myTestDB"
);
print(
"createDatastore: "
+ ds);
// 創(chuàng)建ds
ds = morphia.createDatastore(mongo,
"myTestDB"
);
print(
"createDatastore: "
+ ds);
// 創(chuàng)建一個(gè)帶用戶名、密碼的ds
//ds = morphia.createDatastore(mongo, "myTestDB", "admin", new char[] { '1', '2', '3', '4', '5', '6' });
// 設(shè)置操作資源對象,這里設(shè)置User.class 就可以完成對User的一系列操作
//morphia.map(User.class);
//morphia.mapPackage("com.hoo.entity");//會把整個(gè)包下面的類都加載進(jìn)來
// 將對象轉(zhuǎn)成DBObject
print( "toDBObject: " + morphia.toDBObject( new User(System.currentTimeMillis(), "jackson" , true, 22, null)));
// 將參數(shù)2轉(zhuǎn)換成參數(shù)1的類型
print( "fromDBObject: " + morphia.fromDBObject(User. class , BasicDBObjectBuilder.start( "sex" , true).get()));
print(
"getMapper: "
+ morphia.getMapper());
print( "isMapped: " + morphia.isMapped(User. class ));
}
/**
* <b>function:</b> 對Mapper對象相關(guān)操作
* @author hoojo
* @createDate 2012-2-16下午10:20:38
*/
@Test
public void testMapper() {
Mapper mapper = morphia.getMapper();
// 添加對象映射
print( "addMappedClass: " + mapper.addMappedClass(User. class ));
//print(mapper.addMappedClass(mapper.addMappedClass(User.class));
// 創(chuàng)建實(shí)體緩存
print(
"createEntityCache: "
+ mapper.createEntityCache());
print(mapper.getCollectionName(
"myTestDB"
));
print(mapper.getConverters());
User user = new User(System.currentTimeMillis(), "jackson" , true, 22, null);
user.setId(1306814012734L);
print(mapper.getId(user));
for
(EntityInterceptor ei : mapper.getInterceptors()) {
System.out.println(
"EntityInterceptor: "
+ ei);
}
?
// 查詢主鍵
print(
"getKey: "
+ mapper.getKey(user));
// 所有已經(jīng)映射的class
for
(MappedClass mc : mapper.getMappedClasses()) {
System.out.println(
"getMappedClasses: "
+ mc);
}
print(
"mcMap: "
+ mapper.getMCMap());
print(
"getOptions: "
+ mapper.getOptions());
print(
"keyToRef: "
+ mapper.keyToRef(mapper.getKey(user)));
print(
"refToKey: "
+ mapper.refToKey(mapper.keyToRef(mapper.getKey(user))));
}
/**
* <b>function:</b> 實(shí)體緩存
* @author hoojo
*/
@Test
public void testEntityCache() {
EntityCache ec = morphia.getMapper().createEntityCache();
print(
"EntityCache: "
+ ec);
Datastore ds = morphia.createDatastore(mongo,
"myTestDB"
);
User user = new User(System.currentTimeMillis(), "jackson" , true, 22, null);
user.setId(1306814012734L);
// 添加實(shí)體
ec.putEntity(ds.getKey(user), user);
// 代理
ec.putProxy(ds.getKey(user), user);
print(
"getKey: "
+ ds.getKey(user));
print(
"getProxy: "
+ ec.getProxy(ds.getKey(user)));
print(
"getEntity: "
+ ec.getEntity(ds.getKey(user)));
print(ec.exists(ds.getKey(user)));
print(
"stats: "
+ ec.stats());
}
@After
public void destory() {
mongo = null;
morphia = null;
System.gc();
}
}
四、利用Morphia完成對Datastore對象的CRUD操作
1、 首先添加如下準(zhǔn)備代碼,隨后的方法直接添加到該文件中即可
package
com.hoo.test.ds;
?
import
java.net.UnknownHostException;
import
java.util.ArrayList;
import
java.util.List;
import
org.junit.After;
import
org.junit.Before;
import
org.junit.Test;
import
com.google.code.morphia.Datastore;
import
com.google.code.morphia.Key;
import
com.google.code.morphia.Morphia;
import
com.google.code.morphia.query.UpdateOperations;
import
com.hoo.entity.User;
import
com.mongodb.Mongo;
import
com.mongodb.MongoException;
?
/**
* <b>function:</b> Datastore增刪改查操作
* @author hoojo
* @createDate 2011-5-31下午06:29:04
* @fileDatastore DatastoreTest.java
* @package com.hoo.test.ds
* @project Morphia
* @blog http://blog.csdn.net/IBM_hoojo
* @email hoojo_@126.com
* @version 1.0
*/
public class DatastoreTest {
private
Mongo mongo;
private
Morphia morphia;
private
Datastore ds;
@Before
public void init() {
try
{
mongo =
new
Mongo();
}
catch
(UnknownHostException e) {
e.printStackTrace();
}
catch
(MongoException e) {
e.printStackTrace();
}
morphia =
new
Morphia();
morphia.map(User.
class
);
ds = morphia.createDatastore(mongo,
"temp"
);
}
private void print(Object o) {
if
(o != null) {
System.out.println(o.toString());
}
}
/**
* <b>function:</b> 查詢所有
* @author hoojo
* @createDate 2012-2-16 下午10:36:13
*/
private void query() {
Iterable<User> it = ds.createQuery(User.
class
).fetch();
while
(it.iterator().hasNext()) {
print(
"fetch: "
+ it.iterator().next());
}
}
@After
public void destory() {
mongo = null;
morphia = null;
ds = null;
System.gc();
}
}
2、 增刪改CUD操作
/**
* <b>function:</b> CUD增刪改
* @author hoojo
* @createDate 2012-2-16 下午10:46:08
*/
@Test
public void testCUD() {
// 添加測試數(shù)據(jù)
for ( int i = 0; i < 50; i++) {
User u = new User(System.currentTimeMillis() + i, "test-" + i, ((i % 2 == 0)? true: false), 18 + i, "china-gz#" + i);
print(ds.save(u));
}
//ds.delete(ds.createQuery(User.class));
List<User> users =
new
ArrayList<User>();
users.add( new User(1306907246518L, "zhangsan" , true, 22, "china-gz" ));
User user = new User(System.currentTimeMillis() + 3, "zhaoliu" , true, 29, "china-beijin" );
users.add(user);
users.add( new User(System.currentTimeMillis() + 6, "wangwu" , true, 24, "china-shanghai" ));
users.add( new User(System.currentTimeMillis() + 9, "lisi" , true, 26, "china-wuhan" ));
//添加集合
print(
"save: "
+ ds.save(users));
//添加數(shù)組
print(
"save: "
+ ds.save(users.toArray()));
this
.query();
print( "getKey: " + ds.find(User. class , "id" , 1306907246518L).getKey());
//修改操作
UpdateOperations<User> uo = ds.createUpdateOperations(User.
class
);
print( "update: " + ds.update(ds.find(User. class , "id" , 1306907246518L).getKey(), uo).getUpdatedCount());
uo.add( "name" , "zhaoliuliu" ).set( "age" , 29).set( "sex" , true).add( "address" , "gzz" );
print( "update: " + ds.update(ds.find(User. class , "id" , 1306907246518L).getKey(), uo).getUpdatedCount());
?
print( "update: " + ds.update(ds.createQuery(User. class ).field( "id" ).equal(1306907246518L), uo).getUpdatedCount());
print( "update: " + ds.update(ds.find(User. class , "id" , 1306907246518L), uo).getUpdatedCount());
uo = ds.createUpdateOperations(User.
class
);
uo.set( "name" , "zhaoqq" ).set( "age" , 29).set( "sex" , true).add( "address" , "fzz" );
print( "update: " + ds.update(ds.find(User. class , "id" , 1306907246518L).get(), uo).getUpdatedCount());
print( "update: " + ds.update(ds.createQuery(User. class ).field( "id" ).equal(1306907246518L), uo, true).getUpdatedCount());
// 修改第一個(gè)對象
print( "updateFirst: " + ds.updateFirst(ds.createQuery(User. class ).field( "id" ).equal(1306907246518L), uo).getUpdatedCount());
//當(dāng)參數(shù)createIfMissing為true的時(shí)候,如果修改的對象不存在就會添加這條數(shù)據(jù),如果為false的情況下,不存在也不添加
print( "updateFirst: " + ds.updateFirst(ds.createQuery(User. class ).field( "id" ).equal(1306907246519L), uo, true).getUpdatedCount());
user.setId(1306907246518L);
print( "updateFirst: " + ds.updateFirst(ds.createQuery(User. class ).field( "id" ).equal(1306907246518L), user, true).getUpdatedCount());
user.setId(1306916670518L);
// 合并
print(
"merge: "
+ ds.merge(user).getId());
this
.query();
//刪除
print( "delete: " + ds.delete(ds.createQuery(User. class ).field( "id" ).equal(1306907246518L)).getN());
print( "delete: " + ds.delete(ds.find(User. class , "age" , 29).get()).getN());
//print("delete: " + ds.delete(User.class, 1306911594631L).getN());
//print("delete: " + ds.delete(User.class, users).getN());
//ds.delete(ds.createQuery(User.class));
this
.query();
}
3、 Find查詢操作
/**
* <b>function:</b> find查詢
* @author hoojo
* @createDate 2012-2-16 下午10:45:55
*/
@Test
public void testFind() {
print( "find: " + ds.find(User. class ).asList());
//like
print( "find-contains: " + ds.find(User. class ).field( "name" ).contains( "test-1" ).asList());
//忽略大小寫
print( "find-containsIgnoreCase: " + ds.find(User. class ).field( "name" ).containsIgnoreCase( "ja" ).asList());
print( "find-endsWith: " + ds.find(User. class ).field( "name" ).endsWith( "22" ).asList());
print( "find-endsWithIgnoreCase: " + ds.find(User. class ).field( "name" ).endsWithIgnoreCase( "CK" ).asList());
//過濾null或是沒有name屬性的
print( "find-doesNotExist: " + ds.find(User. class ).field( "name" ).doesNotExist().asList());
//查詢name有值的數(shù)據(jù)
print( "find-doesNotExist: " + ds.find(User. class ).field( "name" ).exists().asList());
//age > 48
print( "find-greaterThan: " + ds.find(User. class ).field( "age" ).greaterThan(66).asList());
//age >= 48
print( "find-greaterThan: " + ds.find(User. class ).field( "age" ).greaterThanOrEq(66).asList());
List<Integer> ageList =
new
ArrayList<Integer>();
ageList.add(22);
ageList.add(55);
ageList.add(66);
//all
print( "find-hasAllOf: " + ds.find(User. class ).field( "age" ).hasAllOf(ageList).asList());
//in
print( "find-hasAnyOf: " + ds.find(User. class ).field( "age" ).hasAnyOf(ageList).asList());
//not in
print( "find-hasNoneOf: " + ds.find(User. class ).field( "age" ).hasNoneOf(ageList).asList());
//elemMatch
//print("find-hasThisElement: " + ds.find(User.class).field("age").hasThisElement(55).asList());
print( "find-hasThisOne: " + ds.find(User. class ).field( "age" ).hasThisOne(55).asList());
print( "find-in: " + ds.find(User. class ).field( "age" ).in(ageList).asList());
print( "find-lessThan: " + ds.find(User. class ).field( "age" ).lessThan(20).asList());
print( "find-lessThanOrEq: " + ds.find(User. class ).field( "age" ).lessThanOrEq(18).asList());
//print("find-lessThanOrEq: " + ds.find(User.class).field("age").near(.2, .8).asList());
print( "find: " + ds.find(User. class , "id" , 1306813979609L).get());
print( "find: " + ds.find(User. class , "age" , 28, 1, 2).asList());
print( "findAndDelete: " + ds.findAndDelete(ds.createQuery(User. class ).field( "id" ).equal(1306813979609L)));
print( "find: " + ds.find(User. class ).asList());
}
4、 Query查詢操作
/**
* <b>function:</b> query查詢
* @author hoojo
* @createDate 2012-2-16 下午10:40:10
*/
@Test
public void testQuery() {
// 查詢所有
print( "query: " + ds.createQuery(User. class ).asList());
// 查詢主鍵
print( "query key: " + ds.createQuery(User. class ).asKeyList());
// 結(jié)果集數(shù)量
print( "query: " + ds.createQuery(User. class ).countAll());
// 抓取查詢所有記錄
Iterable<User> it = ds.createQuery(User.
class
).fetch();
while
(it.iterator().hasNext()) {
print(
"fetch: "
+ it.iterator().next());
}
// null
it = ds.createQuery(User.
class
).fetchEmptyEntities();
while
(it.iterator().hasNext()) {
print(
"fetchEmptyEntities: "
+ it.iterator().next());
}
// all key
Iterable<Key<User>> itkeys = ds.createQuery(User.
class
).fetchKeys();
while
(itkeys.iterator().hasNext()) {
print(
"fetchKeys: "
+ itkeys.iterator().next());
}
// age > 24
print( "query: " + ds.createQuery(User. class ).filter( "age > " , 24).asList());
// age in (20, 28)
print( "query: " + ds.createQuery(User. class ).filter( "age in " , newint[] { 20, 28 }).asList());
// limit 3
print( "query: " + ds.createQuery(User. class ).limit(3).asList());
// 分頁類似MySQL
print( "query: " + ds.createQuery(User. class ).offset(11).limit(5).asList());
// order排序,默認(rèn)asc
print( "query: " + ds.createQuery(User. class ).order( "age" ).asList());
//desc
print( "query: " + ds.createQuery(User. class ).order( "-age" ).asList());
// 組合排序 order by age, name
print( "query: " + ds.createQuery(User. class ).order( "age, name" ).asList());
print( "query: " + ds.createQuery(User. class ).queryNonPrimary().asList());
print( "query: " + ds.createQuery(User. class ).queryPrimaryOnly().asList());
//如果include 為true就表示取該屬性的值,其他的默認(rèn)null,反之為false則該屬性為null,取其他的值
print( "query: " + ds.createQuery(User. class ).retrievedFields(false, "age" ).asList());
}
5、 get和count查詢
/**
* <b>function:</b> get查詢
* @author hoojo
* @createDate 2012-2-16 下午10:39:09
*/
@Test
public void testGet() {
User user =
new
User();
user.setId(1306916670518L);
print(
"get: "
+ ds.get(user));
List<Long> ids =
new
ArrayList<Long>();
ids.add(1306907246519L);
ids.add(1306916670524L);
// 通過id集合查詢相當(dāng)于in ()
print( "get: " + ds.get(User. class , ids).asList());
// id查詢
print( "get: " + ds.get(User. class , 1306916670524L));
}
?
/**
* <b>function:</b> count查詢
* @author hoojo
* @createDate 2012-2-16 下午10:38:02
*/
@Test
public void testGetCount() {
User user =
new
User();
user.setId(1306916670518L);
print(
"getCount: "
+ ds.getCount(user));
print( "getCount: " + ds.getCount(User. class ));
List<Long> ids =
new
ArrayList<Long>();
ids.add(1306907246519L);
ids.add(1306916670524L);
print( "getCount: " + ds.getCount(ds.get(User. class , ids)));
// age > 22的記錄
print( "getCount: " + ds.getCount(ds.createQuery(User. class ).filter( "age > " , 22)));
// 所有
print( "countAll: " + ds.get(User. class , ids).countAll());
print( "countAll: " + ds.find(User. class ).countAll());
}
6、 其他操作
@Test
public void testOthers() {
query();
/** 索引 */
ds.ensureIndexes();
// 同時(shí)用annotation也可以給指定的屬性建立索引
// 只需用在JavaEntity建立索引的屬性上添加annotation
/*@Indexed(value = IndexDirection.ASC, name = "address_index")
String address;
// 建立唯一索引
@Indexed(value = IndexDirection.ASC, name = "bandName", unique = true)
String name;*/
?
ds.ensureCaps();
User user =
new
User();
user.setId(1306916670518L);
print(
"getDB: "
+ ds.getDB());
print(
"getDefaultWriteConcern: "
+ ds.getDefaultWriteConcern());
print( "DBColl: " + ds.getCollection(User. class )); // 查詢User對象對應(yīng)的集合
Key<User> key = ds.getKey(user);
// 主鍵
print(
"getKey: "
+ key);
print( "exists: " + ds.exists(user)); //是否存在該對象
print(
"exists: "
+ ds.exists(ds.getKey(user)));
print( "getByKey: " + ds.getByKey(User. class , key));
List<Key<User>> keys =
new
ArrayList<Key<User>>();
keys.add(key);
user.setId(1306916670521L);
keys.add(ds.getKey(user));
print(
"getByKey: "
+ ds.getByKeys(keys));
print( "getByKey: " + ds.getByKeys(User. class , keys));
query();
}
用Morphia操作對象相對比較簡單,它對MongoDB對Java的操作進(jìn)行了一些封裝,特別是查詢這方面的。有沒有感覺像是在用Hibernate?
作者:
hoojo
?
出處:
?http://www.cnblogs.com/hoojo/archive/2012/02/17/2355384.html?
blog:
http://blog.csdn.net/IBM_hoojo
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。
版權(quán)所有,轉(zhuǎn)載請注明出處 ? 本文出自:?http://www.cnblogs.com/hoojo/archive/2012/02/17/2355384.html?

更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
