NoSQL 之 Morphia 操作 MongoDB
上兩篇文章:http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html
http://www.cnblogs.com/hoojo/archive/2011/06/02/2068665.html
介紹到了在MongoDB的控制臺完成MongoDB的數據操作、以及通過Java MongoDB 的驅動完成在Java中對MongoDB的操作,通過前兩篇文章我們對MongoDB有了全面、深刻的認識和理解。現在我們就看看利用Morphia庫來操作MongoDB。
開發環境:
System:Windows
IDE:eclipse、MyEclipse 8
Database:mongoDB
開發依賴庫:
JavaEE5、mongo-2.5.3.jar、junit-4.8.2.jar, morphia-0.99.jar
Email:hoojo_@126.com
Blog:http://blog.csdn.net/IBM_hoojo
一、準備工作
1、 首先,下載mongoDB對Java支持的驅動包
驅動包下載地址:https://github.com/mongodb/mongo-java-driver/downloads
mongoDB對Java的相關支持、技術:http://www.mongodb.org/display/DOCS/Java+Language+Center
驅動源碼下載: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、 下面建立一個JavaProject工程,導入下載下來的驅動包。即可在Java中使用Morphia,目錄如下:
二、Java操作MongoDB示例
在本示例之前你需要啟動mongod.exe的服務,在你安裝mongoDB的目錄中,找到mongod.exe啟動服務后,下面的程序才能順利執行;
1、 Java操作mongoDB數據庫,操作索引
Mongo mongo = new Mongo();
這樣就創建了一個MongoDB的數據庫連接對象,它默認連接到當前機器的localhost地址,端口是27017。
DB db = mongo.getDB(“test”);
這樣就獲得了一個test的數據庫,如果mongoDB中沒有創建這個數據庫也是可以正常運行的。如果你讀過上一篇文章就知道,mongoDB可以在沒有創建這個數據庫的情況下,完成數據的添加操作。當添加的時候,沒有這個庫,mongoDB會自動創建當前數據庫。
得到了db,下一步我們要獲取一個“聚集集合DBCollection”,通過db對象的getCollection方法來完成。
DBCollection users = db.getCollection("users");
這樣就獲得了一個DBCollection,它相當于我們數據庫的“表”。
查詢所有數據
DBCursor cur = users.find();
while (cur.hasNext()) {
System.out.println(cur.next());
}
用BasicDBObjectBuilder,向users對象中添加數據
user = BasicDBObjectBuilder.start("id", 1546555)
.append("name", "jojo").add("address", "gz")
.append("email", "hoojo_@126.com")
.get();
插入數據
users.insert(user);
可以利用JSON工具來序列化對象數據
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實例對象的相關方法測試 * @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("添加測試數據"); DBCollection users = db.getCollection("users"); try { // 用自定義BasicDBObjectUtils工具類,將User Enity對象轉換成DBObjectDBObject user = BasicDBObjectUtils.castModel2DBObject(new User("345567", "jack", 22, "beijin"));
users.insert(user);
// 用BasicDBObjectBuilder構建一個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("游標查詢所有users集合數據");DBCursor cur = users.find();
while (cur.hasNext()) {System.out.println(cur.next());
}
System.out.println("查詢游標相關內容");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("顯示游標查詢到的所有內容: " + JSON.serialize(cur));}
}
工具類,將帶有getter、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轉換成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、 完成索引操作,首先建立一個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> 實現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;如果默認沒有創建,mongodb會自動創建 db = mg.getDB("temp"); //獲取users DBCollection;如果默認沒有創建,mongodb會自動創建 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相關操作 * @author hoojo * @createDate 2012-2-16 下午08:32:26 */@Test
public void testIndex() {
query();
for (DBObject index : coll.getIndexInfo()) { print("IndexInfo: " + index);}
coll.dropIndexes();
//創建索引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" ));
// 創建唯一索引coll.ensureIndex(new BasicDBObject("emial", 2), new BasicDBObject("unique", false));
// 創建索引,指定索引名稱default_indexcoll.ensureIndex(new BasicDBObject("address", 1), new BasicDBObject( "name" , "default_index"));
// 創建索引對象,索引名稱user_indexcoll.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進行注解,那樣我們就可以用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進行注解@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() {
// 創建一個Datastore,過時的方法不推薦使用 Datastore ds = morphia.createDatastore("myTestDB"); print("createDatastore: " + ds); // 創建ds ds = morphia.createDatastore(mongo, "myTestDB"); print("createDatastore: " + ds); // 創建一個帶用戶名、密碼的ds //ds = morphia.createDatastore(mongo, "myTestDB", "admin", new char[] { '1', '2', '3', '4', '5', '6' }); // 設置操作資源對象,這里設置User.class 就可以完成對User的一系列操作 //morphia.map(User.class); //morphia.mapPackage("com.hoo.entity");//會把整個包下面的類都加載進來 // 將對象轉成DBObjectprint("toDBObject: " + morphia.toDBObject(new User(System.currentTimeMillis(), "jackson", true, 22, null)));
// 將參數2轉換成參數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對象相關操作 * @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)); // 創建實體緩存 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)); // 所有已經映射的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> 實體緩存 * @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);
// 添加實體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、 首先添加如下準備代碼,隨后的方法直接添加到該文件中即可
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() {
// 添加測試數據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)); //添加數組 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());
// 修改第一個對象print("updateFirst: " + ds.updateFirst(ds.createQuery(User.class).field("id").equal(1306907246518L), uo).getUpdatedCount());
//當參數createIfMissing為true的時候,如果修改的對象不存在就會添加這條數據,如果為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());
//likeprint("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有值的數據print("find-doesNotExist: " + ds.find(User.class).field("name").exists().asList());
//age > 48print("find-greaterThan: " + ds.find(User.class).field("age").greaterThan(66).asList());
//age >= 48print("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);
//allprint("find-hasAllOf: " + ds.find(User.class).field("age").hasAllOf(ageList).asList());
//inprint("find-hasAnyOf: " + ds.find(User.class).field("age").hasAnyOf(ageList).asList());
//not inprint("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());
// 結果集數量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 > 24print("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 3print("query: " + ds.createQuery(User.class).limit(3).asList());
// 分頁類似MySQLprint("query: " + ds.createQuery(User.class).offset(11).limit(5).asList());
// order排序,默認ascprint("query: " + ds.createQuery(User.class).order("age").asList());
//descprint("query: " + ds.createQuery(User.class).order("-age").asList());
// 組合排序 order by age, nameprint("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就表示取該屬性的值,其他的默認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集合查詢相當于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();
// 同時用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對象對應的集合
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的操作進行了一些封裝,特別是查詢這方面的。有沒有感覺像是在用Hibernate?
