巨杉数据库SequoiaDB在Java开发中的增删改查CURD

文章目录

  • JSON应用开发
    • 增删改查操作
      • 1 快速入门
        • 1.1 环境部署
          • 部署SequoiaDB集群环境
          • 部署Windows开发环境
        • 1.2 正式开始
      • 2 CURD教程
        • 2.1 Java开发环境搭建
          • 驱动安装
        • 2.2 连接到SequoiaDB
          • 单个连接
          • 使用连接池
        • 2.3 创建集合
          • 创建集合空间
          • 创建集合
            • 创建普通集合
            • 主子集合
        • 2.4 获取集合
          • 指定名称获取集合空间和集合
          • 获取已知集合空间下的集合名称
          • 判断集合空间或集合是否存在
        • 2.5 添加
          • 单条插入
          • 批量插入
        • 2.6 查询
          • 无条件查询
          • 条件查询
            • BSONObject方式
            • 封装DBQuery方式
            • JSON字符串方式
            • 分页查询
        • 2.7 更新
        • 2.8 删除
          • 条件删除
          • 清空集合

JSON应用开发

增删改查操作

1 快速入门

此快速入门通过搭建基础运行环境,以快速了解SequoiaDB在JSON应用开发的基本功能.

1.1 环境部署

需要用到的软件有 : SequoiaDB 3.0 , JDK1.8 , maven 3.3.9 , IntelliJ IDEA 2018 .

部署SequoiaDB集群环境

参考文档 [ 集群模式 ] 章节部署SequoiaDB环境,确保可用.

部署Windows开发环境

这里推荐使用JDK1.8 , maven 3.3.9和IntelliJ IDEA 2018作为Windows开发环境.

1.2 正式开始

  • 在IDEA下创建maven工程

  • 驱动安装 . 在pom.xml添加下列依赖:

    
    	com.sequoiadb
    	sequoiadb-driver
    	3.0.1
    
    
  • 创建方法获得数据库连接:

     public Sequoiadb getConnection() {
     	 /**
         * 创建数据库连接
         * @param connString 地址或主机名:端口
         * @param username 用户名
         * @param password 密码
         * */
     	Sequoiadb sequoiadb = new Sequoiadb("192.168.248.128:11810", "sdbadmin", "sdbadmin");
     	return sequoiadb;
     }
    
  • 创建集合空间

    public void crtCS() {
    	Sequoiadb sequoiadb = getConnection();
        BasicBSONObject options = new BasicBSONObject();
        options.put("PageSize", Sequoiadb.SDB_PAGESIZE_64K);
        options.put("Domain", "testdomain");
        options.put("LobPageSize", 4096);
        /**
        * 创建集合空间
        * @param csName 集合空间名称
        * @param options 配置参数,选项如下:
        *		PageSize: 数据页大小。单位为字节,默认值64K。
        *		Domain: 所属域。
        *		LobPageSize: Lob数据页大小。单位为字节,默认值262144。
        */
        sequoiadb.createCollectionSpace("testcs", options);
    }
    
  • 创建集合

    public void crtCL() {
    	Sequoiadb sequoiadb = getConnection();
        BasicBSONObject options = new BasicBSONObject();
        options.put("ShardingKey", new BasicBSONObject("id", 1));
        options.put("ShardingType", "hash");
        options.put("Compressed", true);
        options.put("CompressionType", "lzw");
        options.put("AutoSplit", true);
        sequoiadb.getCollectionSpace("testcs").createCollection("demoCL", options);
    }
    
  • 获取集合

     public DBCollection getCollection() {
     	Sequoiadb sequoiadb = getConnection();
        CollectionSpace cs = sequoiadb.getCollectionSpace("testcs");
        DBCollection cl = cs.getCollection("demoCL");
        return cl;
    }
    
  • 插入数据

    public void insert() {
        DBCollection dbCollection = getCollection();
        BSONObject bsonObject = new BasicBSONObject();
        bsonObject.put("name", "tom");
        bsonObject.put("age", 19);
        dbCollection.insert(bsonObject);
    }
    
  • 查询数据

    public void query() {
    	DBCollection dbCollection = getCollection();
        // 查询所有记录,并把查询结果放在游标对象中
        DBCursor cursor = dbCollection.query();
        try {
        	while (cursor.hasNext()) {
            	BSONObject record = cursor.getNext();
                // 可将返回记录映射成自定义实体对象(Person)
                Person person = record.as(Person.class);
                System.out.println(person.toString());
            }
        } catch (BaseException e) {
        	System.out.println("Sequoiadb driver error, error description:" + e.getErrorType());
        } catch (Exception e) {
        	e.printStackTrace();
        } finally {
        	cursor.close();
        }
    }
    
  • 更新数据

    public void update() {
    	DBCollection dbCollection = getCollection();
        BSONObject modifier = new BasicBSONObject();
        //age字段加1
        modifier.put("$inc", new BasicBSONObject("age", 1));
        /**
        * 将符合匹配条件的记录进行更新
        * @param matcher 匹配条件
        * @param modifier 更新规则
        * @param hint 指定使用的索引,
        */
        dbCollection.update(null, modifier, null);
    }
    
  • 删除数据

     public void truncate() {
     	DBCollection dbCollection = getCollection();
    	//删除集合中所有数据
        dbCollection.truncate();
    } 
    
    

2 CURD教程

在教程开始之前,我们需要了解一些基本概念:

SequoiaDB数据库中的数据存放分为三个级别:

  • 数据库
  • 集合空间
  • 集合

因此,在数据库操作中,可用三个类来分别表示连接,集合空间,集合实例,另2个类分别表示游标实例和大对象实例:

实例 名称 描述
SequoiaDB 数据库实例 代表一个单独的数据库连接
CollectionSpace 集合空间实例 代表一个单独的集合空间
DBCollection 集合实例 代表一个单独的集合
DBCursor 游标实例 代表一个查询产生的结果集
DBLob 大对象实例 代表一个大对象

Java驱动需要使用不同的实例进行操作.如读取数据的操作需要游标实例,而创建表空间则需要数据库实例.

2.1 Java开发环境搭建

驱动安装

驱动安装的方式有2种:

  • 访问[ http://download.sequoiadb.com/cn/index-cat_id-2 ] 下载Java驱动jar包

  • 使用maven,在pom.xml中添加下列以来

    
    	com.sequoiadb
        sequoiadb-driver
        3.0.1
    
    
    

2.2 连接到SequoiaDB

连接到SequoiaDB的方式有2种:单个连接连接池连接.

在写连接实例之前要了解我们当前准备的SequoiaDB集群环境:

主机名 地址 协调节点端口 sdb用户名 sdb密码
h21 192.168.248.128 11810 sdbadmin sdbadmin
h22 192.168.248.129 11810 sdbadmin sdbadmin
h23 192.168.248.130 11810 sdbadmin sdbadmin
单个连接

SequoiaDB类的构造器

巨杉数据库SequoiaDB在Java开发中的增删改查CURD_第1张图片

这里我们只叙述三种类型构造方法,想要更详细了解参考 Java API

  • 连接地址使用默认的"127.0.0.1:11810"

    /**
     * @param username 用户名
     * @param password 密码
     */
    Sequoiadb sequoiadb = new Sequoiadb("sdbadmin", "sdbadmin");
    
    
  • 指定一个连接地址

    /**  构造方法1:
     * @param addr 地址或主机名
     * @param port 端口
     * @param username 用户名
     * @param password 密码
     */
    Sequoiadb sequoiadb1 = new Sequoiadb("192.168.248.128", 11810, "sdbadmin", "sdbadmin");
    
    /**  构造方法2:
     * @param connString 地址或主机名:端口
     * @param username 用户名
     * @param password 密码
     */
    Sequoiadb sequoiadb2 = new Sequoiadb("192.168.248.128:11810", "sdbadmin", "sdbadmin");
    
    
  • 指定多个连接地址,随机选取一个有效的地址,实现负载均衡

    public Sequoiadb getConnection() {
        ConfigOptions configOptions = new ConfigOptions();
        List connStrings = new ArrayList();
        connStrings.add("192.168.248.128:11810");
        connStrings.add("192.168.248.129:11810");
        connStrings.add("192.168.248.130:11810");
        /** 
    	 * @param connStrings 远程服务器地址"主机:端口"(集合类型)
    	 * @param username 用户名
    	 * @param password 密码
         * @param configOptions 数据库连接配置选项 
    	 */
        Sequoiadb sequoiadb = new Sequoiadb(connStrings, "sdbadmin", "sdbadmin", configOptions);
        return sequoiadb;
    }
    
    
    
使用连接池

Java使用连接池连接SequoiaDB,涉及3个类:

名称 描述
SequoiadbDatasource 连接池实例 代表一个连接池,可使用此类获取连接和将取出的连接放回连接池
ConfigOptions 连接配置实例 设置建立连接的各项参数
DatasourceOptions 连接池配置实例 设置连接池的各项参数

代码:

public class Datasource {
    public static void main(String[] args) throws InterruptedException {
    	//创建集合存储服务器地址
        ArrayList addrs = new ArrayList();
		addrs.add("192.168.248.128:11810");
		addrs.add("192.168.248.129:11810");
		addrs.add("192.168.248.130:11810");
		String user = "sdbadmin";
        String password = "sdbadmin";
        //创建连接配置实例
        ConfigOptions nwOpt = new ConfigOptions();
        //创建连接池配置实例
        DatasourceOptions dsOpt = new DatasourceOptions();
        //创建连接池实例
        SequoiadbDatasource ds = null;
        
        /* 设置网络参数 */
        // 建连超时时间为500ms
        nwOpt.setConnectTimeout(500);
        // 建连失败后重试时间为0ms
        nwOpt.setMaxAutoConnectRetryTime(0);

        /* 设置连接池参数 */
        // 连接池最多能提供500个连接
        dsOpt.setMaxCount(500);
        // 每次增加20个连接
        dsOpt.setDeltaIncCount(20);
        // 连接池空闲时,保留20个连接
        dsOpt.setMaxIdleCount(20);
        // 池中空闲连接存活时间。单位:毫秒。 0表示不关心连接隔多长时间没有收发消息
        dsOpt.setKeepAliveTimeout(0);
        // 每隔60秒将连接池中多于MaxIdleCount限定的空闲连接关闭,并将存活时间过长(连接已停止收发超过keepAliveTimeout时间)的连接关闭。
        dsOpt.setCheckInterval(60 * 1000);
        // 向catalog同步coord地址的周期。单位:毫秒。0表示不同步
        dsOpt.setSyncCoordInterval(0);
        // 连接出池时,是否检测连接的可用性,默认不检测
        dsOpt.setValidateConnection(false);
        // 默认使用coord地址负载均衡的策略获取连接
        dsOpt.setConnectStrategy(ConnectStrategy.BALANCE);

        // 建立连接池
        ds = new SequoiadbDatasource(addrs, user, password, nwOpt, dsOpt);
        // 从连接池获取连接
        Sequoiadb sequoiadb = null;
        try {
            sequoiadb = ds.getConnection();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (sequoiadb != null) {
                // 将连接归还连接池
                ds.releaseConnection(sequoiadb);
            }
        }
        // 任务结束后,关闭连接池
        ds.close();
    }
}

2.3 创建集合

创建集合空间
public void crtCS() {
    Sequoiadb sequoiadb = getConnection();
    BasicBSONObject options = new BasicBSONObject();
    options.put("PageSize", Sequoiadb.SDB_PAGESIZE_64K);
    options.put("Domain", "testdomain");
    options.put("LobPageSize", 4096);
    /**
     * @param csName 集合空间名称
     * @param options 配置参数,选项如下:
     *		PageSize: 数据页大小。单位为字节,默认值64K。
     *		Domain: 所属域。
     *		LobPageSize: Lob数据页大小。单位为字节,默认值262144。
     * @return 集合空间实例
     */
    sequoiadb.createCollectionSpace("foo", options);
}

注:

  • name字段的值不能是空串,不能含点(.)或者美元符号($),且长度不超过127B
  • 同一个数据库对象集合空间名必须唯一。
  • PageSize 只能选填0,4096,8192,16384,32768,65536之一,0即为默认值65536。
  • 所属域必须已经存在,且不能为系统域SYSDOMAIN。
  • LobPageSize只能选填0,4096,8192,16384,32768,65536,131072,262144,524288之一,0即为默认值262144。
创建集合

我们可以创建两种类型的集合:普通集合主子集合

创建普通集合
public void crtCL() {
    Sequoiadb sequoiadb = getConnection();
    BasicBSONObject options = new BasicBSONObject();
    /**
     * 创建普通集合
     *  参数:
     *  ShardingKey : 分区键
     *  ShardingType : 分区方式。默认为hash分区。 hash:hash分区,range:范围分区
     *  Compressed : 标识新集合是否开启数据压缩功能。默认为false
     *  CompressionType : 压缩算法类型。默认为snappy算法。其可选取值如下: snappy,lzw
     *  AutoSplit : 标识新集合是否开启自动切分功能,默认为false
     * */
    options.put("ShardingKey", new BasicBSONObject("id", 1));
    options.put("ShardingType", "hash");
    options.put("Compressed", true);
    options.put("CompressionType", "lzw");
    options.put("AutoSplit", true);
    //在已经创建的集合空间foo下创建集合bar
    sequoiadb.getCollectionSpace("foo").createCollection("bar", options);
}

主子集合
  • 创建主集合 bar.maincl
  • 创建子集合 bar.subcl_2017
  • 创建子集合 bar.subcl_2018
  • 主子集合关联
  • 通过snapshot查看主子集合情况
public void crtMainCL() {
	//获得连接
    Sequoiadb sequoiadb = getConnection();
    /**
     * 创建主集合,主表必须用range切分
     */
    BasicBSONObject mainOptions = new BasicBSONObject();
    // 以字段date作为主集合分区键,此字段为日期类型
    mainOptions.put("ShardingKey", new BasicBSONObject("date", 1));
    mainOptions.put("ShardingType", "range");
    mainOptions.put("IsMainCL", true);
    DBCollection mainCL = sequoiadb.getCollectionSpace("foo").createCollection("maincl", mainOptions);

    /**
     * 创建子集合1(子表既可用range,也可用hash,ShardingKey也不必一定要和主表的一致)
     */
    BasicBSONObject subOptions = new BasicBSONObject();
    subOptions.put("ShardingKey", new BasicBSONObject("id", 1));
    subOptions.put("ShardingType", "hash");
    DBCollection subCL1 = sequoiadb.getCollectionSpace("foo").createCollection("subCL_2017", subOptions);

    /**
     * 创建子集合2
     */
    DBCollection subCL2 = sequoiadb.getCollectionSpace("foo").createCollection("subCL_2018", subOptions);

    /**
     * 将子表1、子表2关联到主表中(将子表附到主表中去,每个子表都有一个范围)
     */
    try {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        BasicBSONObject attachOptions = new BasicBSONObject();
        attachOptions.put("LowBound", new BasicBSONObject("date", format.parse("2017-01-01")));
        attachOptions.put("UpBound", new BasicBSONObject("date", format.parse("2018-01-01")));
        // [2017-01-01, 2018-01-01)
        /**
	 	 * 关联子集合
 		 * @param csName 子集合名称
 	   	 * @param options 分区范围,包含两个字段“LowBound”(区间左值)以及“UpBound”(区间右值),例如:{LowBound:{a:0},UpBound:{a:100}}表示取字段“a”的范围区间:[0, 100)。
 		 */   
        mainCL.attachCollection(subCL1.getFullName(), attachOptions);
        attachOptions.put("LowBound", new BasicBSONObject("date", format.parse("2018-01-01")));
        attachOptions.put("UpBound", new BasicBSONObject("date", format.parse("2019-01-01")));
        // [2018-01-01, 2019-01-01)
        mainCL.attachCollection(subCL2.getFullName(), attachOptions);
    } catch (Exception e) {
        e.printStackTrace();
    }

    /**
     * 可以通过快照查看主子集合情况
     */
    DBCursor snapshot = sequoiadb.getSnapshot(Sequoiadb.SDB_SNAP_CATALOG, "{\"Name\":\"bar.maincl\"}", null, null);
    while (snapshot.hasNext()) {
        BSONObject next = snapshot.getNext();
        System.out.println(next);
    }
}

详细了解options 配置参数,请参考:http://doc.sequoiadb.com/cn/SequoiaDB-cat_id-1432190821-edition_id-0

2.4 获取集合

指定名称获取集合空间和集合
public DBCollection getCollection() {
	//获得连接
    Sequoiadb sequoiadb = getConnection();
    //获取foo集合空间
    CollectionSpace cs = sequoiadb.getCollectionSpace("foo");
    //获取bar集合
    DBCollection cl = cs.getCollection("bar");
    return cl;
}

列举出已存在集合空间名或集合名

//获得连接
Sequoiadb sequoiadb = getConnection();
//获取所有的集合空间
List collectionSpaceNames = sequoiadb.getCollectionSpaceNames();
//获取所有的集合
List collectionNames = sequoiadb.getCollectionNames();

// 列举已有集合空间,将结果放入游标对象中
DBCursor csCursor = sequoiadb.listCollectionSpaces();
while (csCursor.hasNext()) {
    // 返回的对象格式,如:{ "Name" : "foo"}
    BSONObject obj = csCursor.getNext();
    System.out.println(obj.get("Name"));
}
// 列举已有集合,将结果放入游标对象中
DBCursor clCursor = sequoiadb.listCollections();
while (clCursor.hasNext()) {
    // 返回的对象格式,如:{ "Name" : "bar"}
    BSONObject obj = clCursor.getNext();
    System.out.println(obj.get("Name"));
}

获取已知集合空间下的集合名称
Sequoiadb sequoiadb = getConnection();
CollectionSpace cs = sequoiadb.getCollectionSpace("foo");
List collectionNames = cs.getCollectionNames();
System.out.println(collectionNames);

判断集合空间或集合是否存在
Sequoiadb sequoiadb = getConnection();
//集合空间foo 集合bar
String collectionSpaceName = "foo";
String collectionName = "bar";
//初始化集合空间和集合为null
CollectionSpace collectionSpace = null;
DBCollection dbCollection = null;
// 判断指定的集合空间是否存在
if(sequoiadb.isCollectionSpaceExist(collectionSpaceName)) {
    // 存在,则获取集合空间
    collectionSpace = sequoiadb.getCollectionSpace(collectionSpaceName);
} else {
    throw new IllegalArgumentException("collection space is not exist");
}
// 判断已获得集合空间下是否存在指定集合
if(collectionSpace.isCollectionExist(collectionName)) {
    // 存在,则获取集合
    dbCollection = collectionSpace.getCollection(collectionName);
} else {
    throw new IllegalArgumentException("collection is not exist");
}

2.5 添加

单条插入
public void insert() {
    DBCollection dbCollection = getCollection();
    BSONObject bsonObject = new BasicBSONObject();
    //在此对象中设置键值对
    bsonObject.put("name", "jerry");
    bsonObject.put("age", 22);
    /**
     * 向当前集合中插入一条记录,如果记录中不包含字段"_id",将会自动添加。
     * @param insertor 要插入的BSON对象,不能为null
     * @return 表示"_id"值的对象
     */
    Object oid = dbCollection.insert(bsonObject);
    System.out.println(oid);
}


在shell中查看结果

[root@h21 ~]# su - sdbadmin
[sdbadmin@h21 ~]$ sdb
>db = new Sdb();
>db.foo.bar.find();

批量插入
public void bulkinsert() {
    DBCollection dbCollection = getCollection();
    List bsonObjects = new ArrayList<>();
    bsonObjects.add(new BasicBSONObject("name", "rose"));
    bsonObjects.add(new BasicBSONObject("name", "jack"));
    bsonObjects.add(new BasicBSONObject("name", "tom"));
    // bsonObjects.add...
    /**
     * 向当前集合中批量插入数据
     * @param insertor 要插入的BSON对象集合,不能为null
     * @param flag 可选值为 0 或 1。
     * 			如果为1,当发生主键重复时此操作会继续执行(主键重复数据将被忽略),
     *	可用常量DBCollection.FLG_INSERT_CONTONDUP表示;
     *			如果为0,当发生主键重复时此操作被中断。
	 */
    dbCollection.bulkInsert(bsonObjects, 0);
}

2.6 查询

无条件查询
//获取当前集合全部记录
public void query() {
    DBCollection dbCollection= getCollection();
    // 查询所有记录,并把查询结果放在游标对象中
    DBCursor cursor = dbCollection.query();
    try {
        while (cursor.hasNext()) {
            BSONObject record = cursor.getNext();
            // 可将返回记录映射成自定义实体对象(Person)
            Person person = record.as(Person.class);
            System.out.println(person.toString());
        }
    } catch (BaseException e) {
        System.out.println("Sequoiadb driver error, error description:" + e.getErrorType());
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        cursor.close();
    }
}

条件查询
BSONObject方式
public void queryByBsonObj() {
    DBCollection dbCollection = getCollection();
    // 查询条件,查询年龄小于20岁的
    BasicBSONObject matcher = new BasicBSONObject("age", new BasicBSONObject("$lt", 20));
    // 返回字段,这里指定返回"name"和"age"
    BasicBSONObject selector = new BasicBSONObject();
    selector.put("name", "");
    selector.put("age", "");
    // 排序规则,1代表升序,-1代表降序
    // 注意1:如果不设定排序内容,则对返回的结果集不排序。
    // 注意2:如果指定排序字段不包含在返回字段(selector)中,此时设置的排序无意思,将被自动忽略。
    BasicBSONObject orderBy = new BasicBSONObject("age", 1);
    // 指定使用的索引
    BasicBSONObject hint = new BasicBSONObject("", "ageIndex");
    /**
     * 获取当前集合中匹配条件的记录
     * @param matcher 匹配条件,如果为null则返回所有记录
     * @param selector 返回字段,如果为null则返回所有字段
     * @param orderBy 排序规则,如果为null则不进行排序
     * @param hint 指定使用的索引,如:
     *        {"": "ageIndex"},使用名为'ageIndex'的索引来访问数据(index scan);
     *        {"":null}不使用索引来访问数据(table scan)。
     *        如果为null,则自动匹配最佳的索引来访问数据。
     * @return 表示结果集的游标实例
     */
    DBCursor cursor = dbCollection.query(matcher, selector, orderBy, hint);

    try {
        while (cursor.hasNext()) {
            BSONObject record = cursor.getNext();
            System.out.println(record.get("Name") + ":" + record.get("age"));
        }
    } catch (BaseException e) {
        System.out.println("Sequoiadb driver error, error description:" + e.getErrorType());
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        cursor.close();
    }
}

封装DBQuery方式
public void queryByDBQuery() {
    DBCollection dbCollection = getCollection();

    // 查询条件,查询年龄小于20岁的
    BasicBSONObject matcher = new BasicBSONObject("age", new BasicBSONObject("$lt", 20));
    // 返回字段,这里指定返回"name"和"age"
    BasicBSONObject selector = new BasicBSONObject();
    selector.put("name", "");
    selector.put("age", "");
    // 排序规则,1代表升序,-1代表降序
    // 注意1:如果不设定排序内容,则对返回的结果集不排序。
    // 注意2:如果指定排序字段不包含在返回字段(selector)中,此时设置的排序无意思,将被自动忽略。
    BasicBSONObject orderBy = new BasicBSONObject("age", 1);
    // 指定使用的索引
    BasicBSONObject hint = new BasicBSONObject("", "ageIndex");

	// 封装DBQuery对象
    DBQuery dbQuery = new DBQuery();
    dbQuery.setMatcher(matcher);
    dbQuery.setSelector(selector);
    dbQuery.setOrderBy(orderBy);
    dbQuery.setHint(hint);

    DBCursor cursor = dbCollection.query(dbQuery);

    try {
        while (cursor.hasNext()) {
            BSONObject record = cursor.getNext();
            System.out.println(record.get("Name") + ":" + record.get("age"));
        }
    } catch (BaseException e) {
        System.out.println("Sequoiadb driver error, error description:" + e.getErrorType());
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        cursor.close();
    }
}


JSON字符串方式
public void queryByString() {
    DBCollection dbCollection = getCollection();

    // 查询条件,查询年龄小于20岁的
    String matcher = "{age: {$lt:20}}";
    // 返回字段,这里指定返回"name"和"age"
    String selector = "{name:\"\", age:\"\"}";
    // 排序规则,1代表升序,-1代表降序
    // 注意1:如果不设定排序内容,则对返回的结果集不排序。
    // 注意2:如果指定排序字段不包含在返回字段(selector)中,此时设置的排序无意思,将被自动忽略。
    String orderBy = "{age:1}";
    // 指定使用的索引
    String hint = "{\"\": \"ageIndex\"}";

    /*
        此方法省去了构造BSONObject对象的麻烦,
        内部使用 JSON.parse(String s) 将传递的表达式解析成了BSONObject对象
     */
    DBCursor cursor = dbCollection.query(matcher, selector, orderBy, hint);

    try {
        while (cursor.hasNext()) {
            BSONObject record = cursor.getNext();
            System.out.println(record.get("Name") + ":" + record.get("age"));
        }
    } catch (BaseException e) {
        System.out.println("Sequoiadb driver error, error description:" + e.getErrorType());
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        cursor.close();
    }
}

分页查询
/* 
 * 与条件查询类似,只需额外指定两个long类型的参数分别表示"跳过条数"与"返回条数".
 * 本例使用BSONObject的方式,其它方式参考"条件查询"一节
 * skipRows 从返回结果集的第一条开始,指定跳过多少条.如果指定为0,则不跳过.
 * returnRows 返回指定数量的记录.如果指定为0,返回空;-1,返回全部.
 */
public void queryByPage() {
    GetCS cs = new GetCS();
    DBCollection dbCollection = cs.getCollection();
    //查询条件,查询年龄小于20岁的
    BasicBSONObject matcher = new BasicBSONObject("age", new BasicBSONObject("$lt", 20));
    // 返回字段,这里指定返回"name"和"age"
    BasicBSONObject selector = new BasicBSONObject();
    selector.put("name", "");
    selector.put("age", "");
    // 排序规则,1代表升序,-1代表降序
    // 注意1:如果不设定排序内容,则对返回的结果集不排序。
    // 注意2:如果指定排序字段不包含在返回字段(selector)中,此时设置的排序无意思,将被自动忽略。
    BasicBSONObject orderBy = new BasicBSONObject("age", 1);
    // 指定使用的索引,这里指定null,自动匹配
    BasicBSONObject hint = null;
    //获得匹配的记录的条数
    long count = dbCollection.getCount(matcher);
    //每页返回条数
    long returnRows = 10;
    //总页数
    long pages = count % returnRows == 0 ? count / returnRows : count / returnRows + 1;
    for (int i = 0; i < pages; i++) {
    	long skipRows = i * returnRows;
        DBCursor cursor = dbCollection.query(matcher, selector, orderBy, hint, skipRows, returnRows);
       
   	try {
    	System.out.println("page" + i);
        while (cursor.hasNext()) {
        	BSONObject record = cursor.getNext();                   					System.out.println(record.get("Name")+":"+record.get("age"));
        }
        } catch (BaseException e) {
        	e.printStackTrace();
        }finally {
        	cursor.close();
        }
    }
}

2.7 更新

/**
 * 更新集合中所有记录,使用 $inc 将 age 字段的值增加1,不设定matcher和hint参数内容
 */
public void update1() {
    DBCollection dbCollection = getCollection();
    BSONObject modifier = new BasicBSONObject();
    modifier.put("$inc", new BasicBSONObject("age", 1));
    //@param matcher 匹配条件
    //@param modifier 更新规则
    //@param hint 指定使用的索引
    dbCollection.update(null, modifier, null);
}
public void update2() {
    DBCollection dbCollection = getCollection();
    BSONObject matcher = new BasicBSONObject();
    matcher.put("name", new BasicBSONObject("$exsit", 1));
    matcher.put("age", new BasicBSONObject("$exsit", 0));
    BSONObject modifier = new BasicBSONObject();
    modifier.put("$unset", new BasicBSONObject("age", ""));
    dbCollection.update(matcher, modifier, null);
}

2.8 删除

条件删除
public void delete() {
    DBCollection dbCollection = getCollection();
    BSONObject matcher = new BasicBSONObject();
    //删除年龄大于20的记录,使用名为“testIndex"的索引
    matcher.put("age", new BasicBSONObject("$gt", 20));
    BSONObject hint = new BasicBSONObject("", "testIndex");
    //@param matcher 匹配条件
    //@param hint 指定使用的索引
    dbCollection.delete(matcher, hint);
}

清空集合
public void truncate() {
    DBCollection dbCollection = getCollection();
    dbCollection.truncate();
}

你可能感兴趣的:(SequoiaDB)