设为首页 收藏本站
查看: 1194|回复: 0

[经验分享] NoSQL 之 Morphia 操作 MongoDB

[复制链接]

尚未签到

发表于 2015-7-6 06:14:50 | 显示全部楼层 |阅读模式
  上两篇文章:http://www.iyunv.com/hoojo/archive/2011/06/01/2066426.html
  http://www.iyunv.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
  Email:hoojo_@126.com
  Blog:http://blog.iyunv.com/IBM_hoojo
  http://hoojo.iyunv.com/ 一、准备工作

  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,目录如下:
DSC0000.jpg 二、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; /** * function: Mongo实例对象的相关方法测试 * @author hoojo * @createDate 2011-5-24 下午02:42:29 * @file MongoDBTest.java * @package com.hoo.test * @project MongoDB * @blog http://blog.iyunv.com/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对象转换成DBObject            DBObject 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; /** * function: 将Entity/Model转换成DBObject * @author hoojo * @createDate 2011-5-30下午01:53:08 * @file BasicDBObjectUtil.java * @package com.hoo.util * @project MongoDB * @blog http://blog.iyunv.com/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */publicclass BasicDBObjectUtils {    public static 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; /** * function: 实现MongoDB的Index操作 * @author hoojo * @createDate 2011-6-2 下午03:21:23 * @file MongoDB4IndexTest.java * @package com.hoo.test * @project MongoDB * @blog http://blog.iyunv.com/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的操作



/** * function: 测试Collection的index相关操作 * @author hoojo * @createDate 2012-2-16 下午08:32:26 */@Testpublic 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_index    coll.ensureIndex(new BasicDBObject("address", 1), new BasicDBObject( "name" , "default_index"));    // 创建索引对象,索引名称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进行注解,那样我们就可以用morphia操作JavaEntity对象



package com.hoo.entity; import com.google.code.morphia.annotations.Entity;import com.google.code.morphia.annotations.Id; /** * function: JavaEntity对象 * @author hoojo * @createDate 2011-5-31上午11:45:21 * @file User.java * @package com.hoo.entity * @project Morphia * @blog http://blog.iyunv.com/IBM_hoojo * @email hoojo_@126.com * @version 1.0 *///利用morphia的annotation进行注解@Entitypublic 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; /** * function: morphia对象的简单测试 * @author hoojo * @createDate 2011-5-31上午11:30:20 * @file MorphiaTest.java * @package com.hoo.test * @project Morphia * @blog http://blog.iyunv.com/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());        }    }        /**     * function: 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");//会把整个包下面的类都加载进来        // 将对象转成DBObject        print("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));            }        /**     * function: 对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))));    }        /**     * function: 实体缓存     * @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; /** * function: Datastore增删改查操作 * @author hoojo * @createDate 2011-5-31下午06:29:04 * @fileDatastore DatastoreTest.java * @package com.hoo.test.ds * @project Morphia * @blog http://blog.iyunv.com/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());        }    }            /**    * function: 查询所有    * @author hoojo    * @createDate 2012-2-16 下午10:36:13    */    private void query() {        Iterable 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操作



/** * function: CUD增删改 * @author hoojo * @createDate 2012-2-16 下午10:46:08 */@Testpublic 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 users = new ArrayList();    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 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查询操作



/** * function: find查询 * @author hoojo * @createDate 2012-2-16 下午10:45:55 */@Testpublic 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有值的数据    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 ageList = new ArrayList();     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查询操作



/** * function: query查询 * @author hoojo * @createDate 2012-2-16 下午10:40:10 */@Testpublic 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 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 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排序,默认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就表示取该属性的值,其他的默认null,反之为false则该属性为null,取其他的值    print("query: " + ds.createQuery(User.class).retrievedFields(false, "age").asList());}
  5、 get和count查询



/** * function: get查询 * @author hoojo * @createDate 2012-2-16 下午10:39:09 */@Testpublic void testGet() {    User user = new User();    user.setId(1306916670518L);    print("get: " + ds.get(user));    List ids = new ArrayList();    ids.add(1306907246519L);    ids.add(1306916670524L);    // 通过id集合查询相当于in ()    print("get: " + ds.get(User.class, ids).asList());    // id查询    print("get: " + ds.get(User.class, 1306916670524L));} /** * function: count查询 * @author hoojo * @createDate 2012-2-16 下午10:38:02 */@Testpublic void testGetCount() {    User user = new User();    user.setId(1306916670518L);    print("getCount: " + ds.getCount(user));    print("getCount: " + ds.getCount(User.class));        List ids = new ArrayList();    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、 其他操作



@Testpublic 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 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 keys = new ArrayList();    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?

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-83491-1-1.html 上篇帖子: 讨论贴:究竟怎样用MongoDB?【管理员手下留情】 下篇帖子: MongoDB实战开发
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表