NoSQL 之 Morphia 操作 MongoDB

一、准备工作

1 首先,下载mongoDBJava支持的驱动包

驱动包下载地址:https://github.com/mongodb/mongo-java-driver/downloads

mongoDBJava的相关支持、技术: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,目录如下:

NoSQL 之 Morphia 操作 MongoDB

二、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", "[email protected]")

.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 [email protected]

 * @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", "[email protected]").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));

    }

}

工具类,将带有gettersetter方法的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 [email protected]

 * @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> 实现MongoDBIndex操作

 * @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 [email protected]

 * @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 下面完成对象Collectionindex的操作

/**

 * <b>function:</b> 测试Collectionindex相关操作

 * @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_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可以利用annotationJavaEntity进行注解,那样我们就可以用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 [email protected]

 * @version 1.0

 */

//利用morphiaannotation进行注解

@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;

    }

    //gettersetter

   

    @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 [email protected]

 * @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");//会把整个包下面的类都加载进来

        // 将对象转成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));

       

    }

   

    /**

     * <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 [email protected]

 * @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());

    //当参数createIfMissingtrue的时候,如果修改的对象不存在就会添加这条数据,如果为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有值的数据

    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());

    // 结果集数量

    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排序,默认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 getcount查询

/**

 * <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操作对象相对比较简单,它对MongoDBJava的操作进行了一些封装,特别是查询这方面的。有没有感觉像是在用Hibernate

你可能感兴趣的:(NoSQL 之 Morphia 操作 MongoDB)