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

[经验分享] mongo morphia

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-11-11 09:24:50 | 显示全部楼层 |阅读模式
NoSQL 之 Morphia 操作 MongoDB2012-02-17 13:49:26     我来说两句      收藏    DSC0000.jpg 我要投稿上文章 http://www.iyunv/database/201202/119911.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.iyunv.com/IBM_hoojo

http://hoojo.cnblogs.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,目录如下:

DSC0001.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;

/**
* <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.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(&quot;查询所有的Database的名称&quot;);
        for (String name : mg.getDatabaseNames()) {
            System.out.println(&quot;dbName: &quot; &#43; name);
        }
      
        System.out.println(&quot;查询test库中的所有collection集合(表)名称&quot;);
        DB db = mg.getDB(&quot;test&quot;);
        for (String name : db.getCollectionNames()) {
            System.out.println(&quot;collectionName: &quot; &#43; name);
        }
      
        System.out.println(&quot;添加测试数据&quot;);
        DBCollection users = db.getCollection(&quot;users&quot;);
        try {
            // 用自定义BasicDBObjectUtils工具类,将User Enity对象转换成DBObject
            DBObject user = BasicDBObjectUtils.castModel2DBObject(new User(&quot;345567&quot;, &quot;jack&quot;, 22, &quot;beijin&quot;));
            users.insert(user);
            // 用BasicDBObjectBuilder构建一个DBObject对象
            user = BasicDBObjectBuilder.start(&quot;id&quot;, 1546555).append(&quot;name&quot;, &quot;jojo&quot;).add(&quot;address&quot;, &quot;gz&quot;).append(&quot;email&quot;, &quot;hoojo_@126.com&quot;).get();
            users.insert(user);
        } catch (Exception e) {
            e.printStackTrace();
        }
      
        System.out.println(&quot;游标查询所有users集合数据&quot;);
        DBCursor cur = users.find();
        while (cur.hasNext()) {
            System.out.println(cur.next());
        }
        System.out.println(&quot;查询游标相关内容&quot;);
        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(&quot;显示游标查询到的所有内容:&quot; &#43; 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.iyunv.com/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(&quot;get&quot;)) {
                String name = m.getName().replace(&quot;get&quot;, &quot;&quot;);
                for (Method m2 : method) {
                    if (m2.getName().equals(&quot;set&quot; &#43; name)) {
                        name = name.substring(0, 1).toLowerCase() &#43; name.substring(1);
                        Object returnVal = m.invoke(entity, new Object[] {});
                        if (returnVal != null) {
                            //System.out.println(name &#43; &quot; : &quot; &#43; m.invoke(shipping, new Object[] {}));
                            dbObject.put(name, returnVal);
                        }
                    }
                }
            }
        }
        System.out.println(&quot;dbObject: &quot; &#43; 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.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(&quot;localhost&quot;, 27017);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (MongoException e) {
            e.printStackTrace();
        }
        //获取temp DB;如果默认没有创建,mongodb会自动创建
        db = mg.getDB(&quot;temp&quot;);
        //获取users DBCollection;如果默认没有创建,mongodb会自动创建
        users = db.getCollection(&quot;users&quot;);
    }
   
    @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(&quot;IndexInfo: &quot; &#43; index);
    }
   
    coll.dropIndexes();
    //创建索引
    coll.createIndex(new BasicDBObject(&quot;name&quot;, &quot;idx_name&quot;));
    print(coll.findOne(new BasicDBObject(&quot;name&quot;, &quot;haha&quot;)));
    coll.createIndex(coll.findOne(new BasicDBObject(&quot;name&quot;, &quot;haha&quot;)));
    DBObject o = new BasicDBObject(&quot;unique&quot;, true);
    //coll.createIndex(coll.findOne(), o);
   
    // 修改索引,如果存在就修改不存在就添加
    coll.ensureIndex(o);
    coll.ensureIndex(&quot;age_1&quot;);
    coll.ensureIndex(new BasicDBObject(&quot;age3_1&quot;, 6), new BasicDBObject(&quot;ts&quot;, -1));
    coll.ensureIndex(new BasicDBObject(&quot;age_2&quot;, 1), new BasicDBObject( &quot;ts&quot; , 1 ));
    coll.ensureIndex(new BasicDBObject(&quot;password&quot;, 2), new BasicDBObject( &quot;z&quot; , &quot;idx&quot; ));
    coll.ensureIndex(new BasicDBObject(&quot;password&quot;, 1), new BasicDBObject( &quot;etc&quot; , &quot;idx&quot; ));
    // 创建唯一索引
    coll.ensureIndex(new BasicDBObject(&quot;emial&quot;, 2), new BasicDBObject(&quot;unique&quot;, false));
    // 创建索引,指定索引名称default_index
    coll.ensureIndex(new BasicDBObject(&quot;address&quot;, 1), new BasicDBObject( &quot;name&quot; , &quot;default_index&quot;));
    // 创建索引对象,索引名称user_index
    coll.ensureIndex(coll.findOne(new BasicDBObject(&quot;name&quot;, &quot;hoho&quot;)), &quot;user_index&quot;);
    // 唯一索引
    coll.ensureIndex(coll.findOne(new BasicDBObject(&quot;name&quot;, &quot;hehe&quot;)), &quot;users_index_unique&quot;, true);
   
    // 查询所有索引
    for (DBObject index : coll.getIndexInfo()) {
        print(&quot;IndexInfo: &quot; &#43; index);
    }
   
    print(DBCollection.genIndexName(coll.findOne()));
   
    //coll.dropIndex(coll.findOne());
    print(DBCollection.genIndexName(new BasicDBObject(&quot;password&quot;, 2)));
    //coll.dropIndex(DBCollection.genIndexName(new BasicDBObject(&quot;password&quot;, 2)));
    //coll.dropIndexes();
    //coll.dropIndexes(&quot;assword_1&quot;);
}

三、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.iyunv.com/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 &#43; &quot;#&quot; &#43; this.name &#43; &quot;#&quot; &#43; this.age &#43; &quot;#&quot; &#43; this.sex &#43; &quot;#&quot; &#43; 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.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());
        }
    }
   
    /**
     * <b>function:</b> morphia对象的简单测试
     * @author hoojo
     */
    @SuppressWarnings(&quot;deprecation&quot;)
    @Test
    public void testMorphia() {
        // 创建一个Datastore,过时的方法不推荐使用
        Datastore ds = morphia.createDatastore(&quot;myTestDB&quot;);
        print(&quot;createDatastore: &quot; &#43; ds);
        // 创建ds
        ds = morphia.createDatastore(mongo, &quot;myTestDB&quot;);
        print(&quot;createDatastore: &quot; &#43; ds);
        // 创建一个带用户名、密码的ds
        //ds = morphia.createDatastore(mongo, &quot;myTestDB&quot;, &quot;admin&quot;, new char[] { '1', '2', '3', '4', '5', '6' });
      
        // 设置操作资源对象,这里设置User.class 就可以完成对User的一系列操作
        //morphia.map(User.class);
        //morphia.mapPackage(&quot;com.hoo.entity&quot;);//会把整个包下面的类都加载进来
        // 将对象转成DBObject
        print(&quot;toDBObject: &quot; &#43; morphia.toDBObject(new User(System.currentTimeMillis(), &quot;jackson&quot;, true, 22, null)));
        // 将参数2转换成参数1的类型
        print(&quot;fromDBObject: &quot; &#43; morphia.fromDBObject(User.class, BasicDBObjectBuilder.start(&quot;sex&quot;, true).get()));
        print(&quot;getMapper: &quot; &#43; morphia.getMapper());
        print(&quot;isMapped: &quot; &#43; 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(&quot;addMappedClass: &quot; &#43; mapper.addMappedClass(User.class));
        //print(mapper.addMappedClass(mapper.addMappedClass(User.class));
      
        // 创建实体缓存
        print(&quot;createEntityCache: &quot; &#43; mapper.createEntityCache());
        print(mapper.getCollectionName(&quot;myTestDB&quot;));
        print(mapper.getConverters());
        User user = new User(System.currentTimeMillis(), &quot;jackson&quot;, true, 22, null);
        user.setId(1306814012734L);
        print(mapper.getId(user));
      
        for (EntityInterceptor ei : mapper.getInterceptors()) {
            System.out.println(&quot;EntityInterceptor: &quot; &#43; ei);
        }

        // 查询主键
        print(&quot;getKey: &quot; &#43; mapper.getKey(user));
        // 所有已经映射的class
        for (MappedClass mc : mapper.getMappedClasses()) {
            System.out.println(&quot;getMappedClasses: &quot; &#43; mc);
        }
      
        print(&quot;mcMap: &quot; &#43; mapper.getMCMap());
      
        print(&quot;getOptions: &quot; &#43; mapper.getOptions());
        print(&quot;keyToRef: &quot; &#43; mapper.keyToRef(mapper.getKey(user)));
        print(&quot;refToKey: &quot; &#43; mapper.refToKey(mapper.keyToRef(mapper.getKey(user))));
    }
   
    /**
     * <b>function:</b> 实体缓存
     * @author hoojo
     */
    @Test
    public void testEntityCache() {
        EntityCache ec = morphia.getMapper().createEntityCache();
        print(&quot;EntityCache: &quot; &#43; ec);
        Datastore ds = morphia.createDatastore(mongo, &quot;myTestDB&quot;);
        User user = new User(System.currentTimeMillis(), &quot;jackson&quot;, true, 22, null);
        user.setId(1306814012734L);
      
        // 添加实体
        ec.putEntity(ds.getKey(user), user);
        // 代理
        ec.putProxy(ds.getKey(user), user);
      
        print(&quot;getKey: &quot; &#43; ds.getKey(user));
        print(&quot;getProxy: &quot; &#43; ec.getProxy(ds.getKey(user)));
        print(&quot;getEntity: &quot; &#43; ec.getEntity(ds.getKey(user)));
      
        print(ec.exists(ds.getKey(user)));
      
        print(&quot;stats: &quot; &#43; 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.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, &quot;temp&quot;);
    }
   
    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(&quot;fetch: &quot; &#43; 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&#43;&#43;) {
        User u = new User(System.currentTimeMillis() &#43; i, &quot;test-&quot; &#43; i, ((i % 2 == 0)? true: false), 18 &#43; i, &quot;china-gz#&quot; &#43; i);
        print(ds.save(u));
    }
    //ds.delete(ds.createQuery(User.class));
   
    List<User> users = new ArrayList<User>();
    users.add(new User(1306907246518L, &quot;zhangsan&quot;, true, 22, &quot;china-gz&quot;));
    User user = new User(System.currentTimeMillis() &#43; 3, &quot;zhaoliu&quot;, true, 29, &quot;china-beijin&quot;);
    users.add(user);
    users.add(new User(System.currentTimeMillis() &#43; 6, &quot;wangwu&quot;, true, 24, &quot;china-shanghai&quot;));
    users.add(new User(System.currentTimeMillis() &#43; 9, &quot;lisi&quot;, true, 26, &quot;china-wuhan&quot;));
    //添加集合
    print(&quot;save: &quot; &#43; ds.save(users));
   
    //添加数组
    print(&quot;save: &quot; &#43; ds.save(users.toArray()));
   
    this.query();
    print(&quot;getKey: &quot; &#43; ds.find(User.class, &quot;id&quot;, 1306907246518L).getKey());
   
    //修改操作
    UpdateOperations<User> uo = ds.createUpdateOperations(User.class);
   
    print(&quot;update: &quot; &#43; ds.update(ds.find(User.class, &quot;id&quot;, 1306907246518L).getKey(), uo).getUpdatedCount());
    uo.add(&quot;name&quot;, &quot;zhaoliuliu&quot;).set(&quot;age&quot;, 29).set(&quot;sex&quot;, true).add(&quot;address&quot;, &quot;gzz&quot;);
    print(&quot;update: &quot; &#43; ds.update(ds.find(User.class, &quot;id&quot;, 1306907246518L).getKey(), uo).getUpdatedCount());

    print(&quot;update: &quot; &#43; ds.update(ds.createQuery(User.class).field(&quot;id&quot;).equal(1306907246518L), uo).getUpdatedCount());
    print(&quot;update: &quot; &#43; ds.update(ds.find(User.class, &quot;id&quot;, 1306907246518L), uo).getUpdatedCount());
   
    uo = ds.createUpdateOperations(User.class);
    uo.set(&quot;name&quot;, &quot;zhaoqq&quot;).set(&quot;age&quot;, 29).set(&quot;sex&quot;, true).add(&quot;address&quot;, &quot;fzz&quot;);
    print(&quot;update: &quot; &#43; ds.update(ds.find(User.class, &quot;id&quot;, 1306907246518L).get(), uo).getUpdatedCount());
   
    print(&quot;update: &quot; &#43; ds.update(ds.createQuery(User.class).field(&quot;id&quot;).equal(1306907246518L), uo, true).getUpdatedCount());
   
    // 修改第一个对象
    print(&quot;updateFirst: &quot; &#43; ds.updateFirst(ds.createQuery(User.class).field(&quot;id&quot;).equal(1306907246518L), uo).getUpdatedCount());
    //当参数createIfMissing为true的时候,如果修改的对象不存在就会添加这条数据,如果为false的情况下,不存在也不添加
    print(&quot;updateFirst: &quot; &#43; ds.updateFirst(ds.createQuery(User.class).field(&quot;id&quot;).equal(1306907246519L), uo, true).getUpdatedCount());
    user.setId(1306907246518L);
    print(&quot;updateFirst: &quot; &#43; ds.updateFirst(ds.createQuery(User.class).field(&quot;id&quot;).equal(1306907246518L), user, true).getUpdatedCount());
   
    user.setId(1306916670518L);
    // 合并
    print(&quot;merge: &quot; &#43; ds.merge(user).getId());
    this.query();
   
    //删除
    print(&quot;delete: &quot; &#43; ds.delete(ds.createQuery(User.class).field(&quot;id&quot;).equal(1306907246518L)).getN());
    print(&quot;delete: &quot; &#43; ds.delete(ds.find(User.class, &quot;age&quot;, 29).get()).getN());
    //print(&quot;delete: &quot; &#43; ds.delete(User.class, 1306911594631L).getN());
    //print(&quot;delete: &quot; &#43; 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(&quot;find: &quot; &#43; ds.find(User.class).asList());
    //like
    print(&quot;find-contains: &quot; &#43; ds.find(User.class).field(&quot;name&quot;).contains(&quot;test-1&quot;).asList());
    //忽略大小写
    print(&quot;find-containsIgnoreCase: &quot; &#43; ds.find(User.class).field(&quot;name&quot;).containsIgnoreCase(&quot;ja&quot;).asList());
   
    print(&quot;find-endsWith: &quot; &#43; ds.find(User.class).field(&quot;name&quot;).endsWith(&quot;22&quot;).asList());
    print(&quot;find-endsWithIgnoreCase: &quot; &#43; ds.find(User.class).field(&quot;name&quot;).endsWithIgnoreCase(&quot;CK&quot;).asList());
   
    //过滤null或是没有name属性的
    print(&quot;find-doesNotExist: &quot; &#43; ds.find(User.class).field(&quot;name&quot;).doesNotExist().asList());
    //查询name有&#20540;的数据
    print(&quot;find-doesNotExist: &quot; &#43; ds.find(User.class).field(&quot;name&quot;).exists().asList());
    //age > 48
    print(&quot;find-greaterThan: &quot; &#43; ds.find(User.class).field(&quot;age&quot;).greaterThan(66).asList());
    //age >= 48
    print(&quot;find-greaterThan: &quot; &#43; ds.find(User.class).field(&quot;age&quot;).greaterThanOrEq(66).asList());
   
    List<Integer> ageList = new ArrayList<Integer>();
    ageList.add(22);
    ageList.add(55);
    ageList.add(66);
    //all
    print(&quot;find-hasAllOf: &quot; &#43; ds.find(User.class).field(&quot;age&quot;).hasAllOf(ageList).asList());
    //in
    print(&quot;find-hasAnyOf: &quot; &#43; ds.find(User.class).field(&quot;age&quot;).hasAnyOf(ageList).asList());
    //not in
    print(&quot;find-hasNoneOf: &quot; &#43; ds.find(User.class).field(&quot;age&quot;).hasNoneOf(ageList).asList());
    //elemMatch
    //print(&quot;find-hasThisElement: &quot; &#43; ds.find(User.class).field(&quot;age&quot;).hasThisElement(55).asList());
    print(&quot;find-hasThisOne: &quot; &#43; ds.find(User.class).field(&quot;age&quot;).hasThisOne(55).asList());
   
    print(&quot;find-in: &quot; &#43; ds.find(User.class).field(&quot;age&quot;).in(ageList).asList());
    print(&quot;find-lessThan: &quot; &#43; ds.find(User.class).field(&quot;age&quot;).lessThan(20).asList());
    print(&quot;find-lessThanOrEq: &quot; &#43; ds.find(User.class).field(&quot;age&quot;).lessThanOrEq(18).asList());
   
    //print(&quot;find-lessThanOrEq: &quot; &#43; ds.find(User.class).field(&quot;age&quot;).near(.2, .8).asList());
   
    print(&quot;find: &quot; &#43; ds.find(User.class, &quot;id&quot;, 1306813979609L).get());
    print(&quot;find: &quot; &#43; ds.find(User.class, &quot;age&quot;, 28, 1, 2).asList());
   
    print(&quot;findAndDelete: &quot; &#43; ds.findAndDelete(ds.createQuery(User.class).field(&quot;id&quot;).equal(1306813979609L)));
    print(&quot;find: &quot; &#43; 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(&quot;query: &quot; &#43; ds.createQuery(User.class).asList());
    // 查询主键
    print(&quot;query key: &quot; &#43; ds.createQuery(User.class).asKeyList());
    // 结果集数量
    print(&quot;query: &quot; &#43; ds.createQuery(User.class).countAll());
    // 抓取查询所有记录
    Iterable<User> it = ds.createQuery(User.class).fetch();
    while(it.iterator().hasNext()) {
        print(&quot;fetch: &quot; &#43; it.iterator().next());
    }
   
    // null
    it = ds.createQuery(User.class).fetchEmptyEntities();
    while(it.iterator().hasNext()) {
        print(&quot;fetchEmptyEntities: &quot; &#43; it.iterator().next());
    }
   
    // all key
    Iterable<Key<User>> itkeys = ds.createQuery(User.class).fetchKeys();
    while(itkeys.iterator().hasNext()) {
        print(&quot;fetchKeys: &quot; &#43; itkeys.iterator().next());
    }
   
    // age > 24
    print(&quot;query: &quot; &#43; ds.createQuery(User.class).filter(&quot;age > &quot;, 24).asList());
    // age in (20, 28)
    print(&quot;query: &quot; &#43; ds.createQuery(User.class).filter(&quot;age in &quot;, newint[] { 20, 28 }).asList());
   
    // limit 3
    print(&quot;query: &quot; &#43; ds.createQuery(User.class).limit(3).asList());
    // 分页类&#20284;MySQL
    print(&quot;query: &quot; &#43; ds.createQuery(User.class).offset(11).limit(5).asList());
    // order排序,默认asc
    print(&quot;query: &quot; &#43; ds.createQuery(User.class).order(&quot;age&quot;).asList());
    //desc
    print(&quot;query: &quot; &#43; ds.createQuery(User.class).order(&quot;-age&quot;).asList());
    // 组合排序order by age, name
    print(&quot;query: &quot; &#43; ds.createQuery(User.class).order(&quot;age, name&quot;).asList());
   
    print(&quot;query: &quot; &#43; ds.createQuery(User.class).queryNonPrimary().asList());
    print(&quot;query: &quot; &#43; ds.createQuery(User.class).queryPrimaryOnly().asList());
    //如果include 为true就表示取该属性的&#20540;,其他的默认null,反之为false则该属性为null,取其他的&#20540;
    print(&quot;query: &quot; &#43; ds.createQuery(User.class).retrievedFields(false, &quot;age&quot;).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(&quot;get: &quot; &#43; ds.get(user));
    List<Long> ids = new ArrayList<Long>();
    ids.add(1306907246519L);
    ids.add(1306916670524L);
    // 通过id集合查询相当于in ()
    print(&quot;get: &quot; &#43; ds.get(User.class, ids).asList());
    // id查询
    print(&quot;get: &quot; &#43; 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(&quot;getCount: &quot; &#43; ds.getCount(user));
    print(&quot;getCount: &quot; &#43; ds.getCount(User.class));
   
    List<Long> ids = new ArrayList<Long>();
    ids.add(1306907246519L);
    ids.add(1306916670524L);
    print(&quot;getCount: &quot; &#43; ds.getCount(ds.get(User.class, ids)));
   
    // age > 22的记录
    print(&quot;getCount: &quot; &#43; ds.getCount(ds.createQuery(User.class).filter(&quot;age > &quot;, 22)));
    // 所有
    print(&quot;countAll: &quot; &#43; ds.get(User.class, ids).countAll());
    print(&quot;countAll: &quot; &#43; ds.find(User.class).countAll());
}

6、 其他操作

@Test
public void testOthers() {
    query();
    /** 索引*/
    ds.ensureIndexes();
    // 同时用annotation也可以给指定的属性建立索引
    // 只需用在JavaEntity建立索引的属性上添加annotation
    /*@Indexed(value = IndexDirection.ASC, name = &quot;address_index&quot;)
    String address;
    // 建立唯一索引
    @Indexed(value = IndexDirection.ASC, name = &quot;bandName&quot;, unique = true)
    String name;*/

    ds.ensureCaps();
    User user = new User();
    user.setId(1306916670518L);
    print(&quot;getDB: &quot; &#43; ds.getDB());
    print(&quot;getDefaultWriteConcern: &quot; &#43; ds.getDefaultWriteConcern());
    print(&quot;DBColl: &quot; &#43; ds.getCollection(User.class)); // 查询User对象对应的集合
    Key<User> key = ds.getKey(user); // 主键
    print(&quot;getKey: &quot; &#43; key);
    print(&quot;exists: &quot; &#43; ds.exists(user)); //是否存在该对象
    print(&quot;exists: &quot; &#43; ds.exists(ds.getKey(user)));
   
    print(&quot;getByKey: &quot; &#43; 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(&quot;getByKey: &quot; &#43; ds.getByKeys(keys));
    print(&quot;getByKey: &quot; &#43; 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-137760-1-1.html 上篇帖子: MongoDB无法启动(Error: couldn't connect to server 127.0.0.1:27017 src/mongo/ shell/m 下篇帖子: MongoDB数据库建立连接
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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