Skip to content

其它......

Frank Wen edited this page Jan 11, 2019 · 16 revisions

排序

bugu-mongo支持用字符串来表示排序规则。排序字符串可以采用标准的JSON格式,如:

@RefList(sort="{'level': -1}")  //1表示升序,-1表示降序

排序字符串可以用在注解中,也可以用在sort()方法中:

List<Foo> list = dao.query.is("valid", true).sort("{'level':1}").results();

若有多个排序条件,中间用逗号(,)隔开:

@RefList(sort="{'level':1, 'timestamp':-1}")

也可以省略单引号,使用简化的JSON格式:

@RefList(sort="{level:1}")

@RefList(sort="{level:1, timestamp:-1}")

此外,bugu-mongo还提供了SortUtil工具类,用于创建排序字符串:

List<Foo> list = dao.query.is("valid", true).sort(SortUtil.desc("level")).results();

null值

对于值为null的属性,bugu-mongo不会将其保存到数据库中,也就是说,数据库中不会存在这个属性。

例如,假设数据库中有2条记录:

{ 
    "_id" : ObjectId("570876be5cad6e3cd4f15034"), 
    "title" : "About Java", 
    "author" : "Frank", 
    "price" : 55.0, 
    "publishDate" : ISODate("2016-04-09T03:27:58.100+0000")
}
{ 
    "_id" : ObjectId("570876bf5cad6e3cd4f1503b"), 
    "title" : "About C++", 
    "author" : "Tom", 
    "price" : 60.0
}

第2条记录没有publishDate属性,因为保存的时候,这是一个值为null的Date数据。

对于值为null的属性,如果要对其进行查询,有2种方法:

Book book = dao.query().is("publishDate", null).result();

或者

Book book = dao.query().notExistsField("publishDate").result();

其结果都是上述的第2条记录。

BuguQuery还有另一个方法existsField(String key),用以匹配不为null的属性(即,存在的属性)。例如:

Book book = dao.query().existsField("publishDate").result();

其结果是上述的第1条记录。

findAndModify

BuguDao提供了各种类型的findAndModify操作,用于查询并修改数据。使用findAndModify,可以根据需要,返回修改前、修改后的数据。例如:可以同时在网页上显示修改前、修改后的数据。

//返回修改前的数据
public T findAndModify(String id, BuguUpdater updater)

//如果returnNew=true,则返回修改后的数据,否则返回修改前的数据
public T findAndModify(String id, BuguUpdater updater, boolean returnNew)

public T findAndModify(String key, Object value, BuguUpdater updater)

public T findAndModify(String key, Object value, BuguUpdater updater, boolean returnNew)

public T findAndModify(BuguQuery query, BuguUpdater updater)

public T findAndModify(BuguQuery query, BuguUpdater updater, boolean returnNew)

BuguDao还提供了各种类型的findAndRemove操作,可以返回删除前的数据。

public T findAndRemove(String id)

public T findAndRemove(String key, Object value)

public T findAndRemove(BuguQuery query)

WriteConcern

参考作者个人主页中的Wiki:MongoDB Java Driver中的写操作策略

JSON数据

工具类BuguMapper提供了一个方法:toJsonString(Object obj),可以将一个对象转换成JSON字符串。对象obj可以是自定义的Java对象(Entity、非Entity都可以),也可以是DBObject。

AdvancedDao

在旧版本的bugu-mongo中,提供了一个AdvancedDao类,用来实现Aggregation和MapReduce功能。从2.4.0版本开始,Aggregation功能已经移到BuguDao中,同时AdvancedDao被标注为@Deprecated,建议不再使用。

bugu-mongo-lucene模块

在2.x版本的bugu-mongo中,提供了对lucene的支持,即bugu-mongo-lucene扩展模块。该模块已经从3.x版本中移除,不再进行更新维护。

bugu-mongo-lucene模块的文档,请查看这里

countFast()

MongoDB的count()操作,无法利用索引,在数据量很大的情况下,操作会很慢。bugu-mongo提供了countFast()方法,其原理是利用Aggregation来实现count功能,速度要快很多。

distinctLarge()

MongoDB的distinct()操作,有内存限制,在数据量很大的情况下,会超出内存限制,导致失败。bugu-mongo提供了distinctLarge()方法,其原理是利用Aggregation来实现distinct功能,可以避免失败。

事务

MongoDB 4.0已经支持事务,但bugu-mongo目前还不支持。