其它
排序
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目前还不支持。