赞
踩
下载地址为 https://www.mongodb.com/try/download/community-kubernetes-operator ,学习使用社区版本
查看所有的数据库:show dbs /show databases
切换数据库:use db_name
查看使用当前的数据库:db
删除当前的数据库:db.dropDatabase()
查看数据库中所有集合(表):show collections
查看指定集合下所有文档(JSON数据):db.集合名称.find()
查看数据库信息:db.stats()
一般来说,无需手动创建集合,首次插入会自动创建集合信息
手动创建结合:
db.createCollection(name, options)
db.createCollection(“contract”)
db.createCollection(“contract”, { capped : true, size : 20 } )
参数capped: 默认值为false表示不设置上限,值为true表示设置上限
参数size: 当capped值为true时, 需要指定此参数, 表示上限⼤⼩,当⽂档达到上限时, 会将之前的数据覆盖, 单位为字节
show collections 展示当前数据库中集合
db.集合名称.drop() 删除集合
数据类型 | 介绍 |
---|---|
Object ID | ⽂档ID |
String | 字符串, 最常⽤, 必须是有效的UTF-8 |
Boolean | 存储⼀个布尔值, true或false |
Integer | 整数可以是32位或64位, 这取决于服务器 |
Double | 存储浮点值 |
Arrays | 数组或列表, 多个值存储到⼀个键 |
Object | ⽤于嵌⼊式的⽂档, 即⼀个值为⼀个⽂档 |
Null | 存储Null值 |
Timestamp | 时间戳, 表示从1970-1-1到现在的总秒数 |
Date | 存储当前⽇期或时间的UNIX时间格式 |
**注意:**标注红色为常用类型
日期创建语句: new Date(‘2017-12-20’)
每个⽂档都有⼀个属性, 为 _id , 保证每个⽂档的唯⼀性
可以⾃⼰去设置 _id 插⼊⽂档,如果没有提供, 那么MongoDB为每个⽂档提供了⼀个独特的_id , 类型为objectID
objectID是⼀个12字节的⼗六进制数:
前4个字节为当前时间戳
接下来3个字节的机器ID
接下来的2个字节中MongoDB的服务进程id
最后3个字节是简单的增量值
常用语法如下:
注意:
执行语句如下:
--法人信息 db.tb_csm_corporation.insertMany([ {name: "王五", age: 18, sex: "男", hobby: "美女11"}, {name: "大力", age: 20, sex: "男", hobby: "酒吧"}, {name: "德胜", age: 21, sex: "男", hobby: "吐痰"}, {name: "海格力斯", age: 21, sex: "女", hobby: "common on"}, {name: "jeny", age: 21, sex: "女", hobby: "common on"}, {name: "jack", age: 21, sex: "女", hobby: "common on"} ]); --个人信息 db.tb_csm_individual.insertMany([ {name: "王五", age: 18, sex: "男", hobby: "美女11"}, {name: "大力", age: 20, sex: "男", hobby: "酒吧"}, {name: "德胜", age: 21, sex: "男", hobby: "吐痰"}, {name: "海格力斯", age: 21, sex: "女", hobby: "common on"}, {name: "jeny", age: 21, sex: "女", hobby: "common on"}, {name: "jack", age: 21, sex: "女", hobby: "common on"} ]);
具体查询语法为 db.集合名称.find()
具体执行语句为 db.集合名称.save(document)
注意:如果⽂档的 _id 已经存在则修改, 如果⽂档的_id不存在则添加
具体修改的语法格式信息
db.集合名称.update( ,,{multi: })
更新一条(字段全部替换):db.集合名称.update({name:‘原始数据’},{name:‘修改后数据’})
更新一条(仅更新一个字段):db.集合名称.update({name:‘原始数据’},{$set:{name:‘修改后数据’}}) ,推荐使用
更新全部:db.集合名称.update({name:‘原始数据’},{$set:{name:‘修改后数据’}},{multi:true})
参数 query:查询条件
参数 update:更新操作符
参数 multi:可选, 默认是false,表示只更新找到的第⼀条记录, 值为true表示把满⾜条件的⽂档全部更新
注意:{multi:true}需要和 $set 配合使用
具体使用案例
具体删除数据格式 db.集合名称.remove(,{justOne: })
删除单条数据
不带justOne则删除多条数据
db.tb_csm_corporation.insertMany([
{name: "王五", age: 18, sex: "男", hobby: "美女11"},
{name: "大力", age: 20, sex: "男", hobby: "酒吧"},
{name: "德胜", age: 21, sex: "男", hobby: "吐痰"},
{name: "海格力斯", age: 21, sex: "女", hobby: "common on"},
{name: "jeny", age: 21, sex: "女", hobby: "common on"}
]);
运算符如下:
等于: 默认是等于判断, 没有运算符
⼩于:$lt (less than)
⼩于等于:$lte (less than equal)
⼤于:$gt (greater than)
⼤于等于:$gte
不等于:$ne
格式:db.集合名称.find({xxx:{$gte:18}})
运算符:
i
n
(
‘
代表在条件内
‘
)
,
in(`代表在条件内`),
in(‘代表在条件内‘),nin(代表不在条件内
)
and:在json中写多个条件即可
格式:db.集合名称.find({条件1, 条件2})
or:使⽤$or
, 值为数组, 数组中每个元素为json
格式:db.集合名词.find({$or:[{条件1}, {条件2}]})
使⽤//
或$regex
编写正则表达式
格式1:db.集合名称.find({name:/^jack/})
格式2:db.集合名词.find({name:{$regex:'^tom'}})
⽤于读取指定数量的⽂档:db.集合名称.find().limit(number)
⽤于跳过指定数量的⽂档:db.集合名称.find().skip(number)
同时使用:
$where
后⾯写⼀个函数, 返回满⾜条件的数据
db.集合名称.find({
$where:function() {
return this.条件;}
})
查询自己想要的字段,其余字段不显示
db.集合名称.find({条件(可省略)},{字段名称:1,…})
基本语法:db.集合名称.find().sort({字段:1,…})
统计结果集中⽂档条数:
db.集合名称.find({条件}).count()
db.集合名称.count({条件})
db.集合名称.distinct(‘去重字段’,{条件})
聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。
语法格式:db.集合名称.aggregate({管道:{表达式}})
在mongodb中,⽂档处理完毕后, 通过管道进⾏下⼀次处理
常用管道如下:
$group: 将集合中的⽂档分组, 可⽤于统计结果
$match: 过滤数据, 只输出符合条件的⽂档
$project: 修改输⼊⽂档的结构, 如重命名、 增加、 删除字段、 创建计算结果
$sort: 将输⼊⽂档排序后输出
$limit: 限制聚合管道返回的⽂档数
$skip: 跳过指定数量的⽂档, 并返回余下的⽂档
$unwind: 将数组类型的字段进⾏拆分
表达式:
将集合中的文档分组,可用于统计结果,_id
表示分组的依据,使用某个字段的格式为’$字段
’
查询sex分别有哪些值
db.tb_csm_corporation.aggregate(
{$group:{
_id:"$sex"
}
}
)
按照sex分组,分别查询各组共有多少人
db.tb_csm_corporation.aggregate(
{$group:
{
_id:"$sex",
# 此处为自定义列
cus_count:{$sum:1}
}
}
)
按照sex分组,分别查询各组多少总数以及平均年龄信息
db.tb_csm_corporation.aggregate(
{$group:
{
_id:"$sex",
count:{$sum:1},
avg_age:{$avg:"$age"}
}
}
)
按照sex分组,统计每组人的名字
db.tb_csm_corporation.aggregate(
{$group:
{
_id:"$sex",
name:{$push:"$name"}
}
}
)
使用$$ROOT可以将文档内容加入到结果集的数组中
db.tb_csm_corporation.aggregate(
{$group:
{
_id:"$sex",
name:{$push:"$$ROOT"}
}
}
)
_id:null
:将集合中所有文档分为一组
查询当前结果集总数以及平均年龄
db.tb_csm_corporation.aggregate(
{$group:
{
_id:null,
count:{$sum:1},
avg_age:{$avg:"$age"}
}
}
)
多字段分组,使用sex以及name分组,并且取得对应name组合信息
db.tb_csm_corporation.aggregate(
{$group:
{
_id:{sex:"$sex",name:"$name"},
name:{$push:"$name"}
}
}
)
group 总结
$group对应的字典中有几个键,结果中就有几个键
分组依据需要放到_ id后面
取不同的字段的值需要使用 ,如: ,如: ,如:hometown、 a g e 、 age、 age、sex
取字典嵌套的字典中值的时候$id.字段名
同时取多个键进行分组:{KaTeX parse error: Expected '}', got 'EOF' at end of input: …up:{_id:{字段名1:"字段名1",字段名2:“字段名2”}}};输出结果:{_id:{字段名1:“”,字段名2:“”}
修改输入文档的结构,如重命名、增加、删除字段、创建计算结果;简单来说就是修改输入输出的值
查询结果集只显示name,age两列
db.tb_csm_corporation.aggregate(
{$project:{
_id:0, name:1, age:1}
}
)
按性别排序,查询男女人数,并且只输出人数信息
db.tb_csm_corporation.aggregate(
{$group:{_id:'$sex', count:{$sum:1}}},
{$project:{_id:0, count:1}}
)
用于过滤数据,只输出符合条件的文档,其特点如下:
match
是管道命令,能将结果交给后一个管道,但是find
不可以查询年龄大于20的人员信息
db.tb_csm_corporation.aggregate(
{$match:{age:{$gt:20}}}
)
查询年龄大于等于18的男生、女生人数
db.tb_csm_corporation.aggregate(
{$match:{age:{$gte:18}}},
{$group:{_id:'$sex',count:{$sum:1}}}
)
按照年龄升序排序
db.tb_csm_corporation.aggregate({$sort:{age:1}})
按照性别分组,分组结果再按人数降序
db.tb_csm_corporation.aggregate({$limit:2})
限制聚合管道返回的文档数量
跳过指定数量的文档,并返回余下的文档
db.tb_csm_corporation.aggregate({$skip:2})
从第三条数据开始,返回1条数据
db.tb_csm_corporation.aggregate(
{$skip:2},
{$limit:1}
)
将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值
基本语法:
db. 集合名称.aggregate({$unwind:'$字段名称’})
将大壮的t-shirt尺码进行拆分
查询大壮有多少个t-shirt尺码
db.tb_csm_corporation.aggregate(
{$match:{username:"大壮"}},
{$unwind:"$size"},
{$group:{_id:null, sum:{$sum:1}}}
)
属性preserveNullAndEmptyArrays
值为true表示保留属性值为空的⽂档;值为false表示丢弃属性值为空的⽂档
mongodb可以实现多集合连接查询,具体语法使用 $lookup
{
$lookup:
{
from: <collection to join>,
localField: <field from the input documents>,
foreignField: <field from the documents of the "from" collection>,
as: <output array field>
}
}
连接查询语句解析
语法值 | 具体作用 |
---|---|
from | 同库下join的collection集合 |
localField | 发起连接集合的关联key,如果文档中没有则设定localField:null |
foreignField | 同库下join的collection集合的关联key,如果文档中没有则设定foreignField:null |
as | 关联的展示结果集 |
最终执行类似于sql:
SELECT *,
FROM collection
WHERE IN (SELECT *
FROM
WHERE = <collection.localField>);
具体执行案例如下:
db.tb_csm_corporation.aggregate([
{
$lookup:
{
from: "tb_csm_individual",
localField: "name",
foreignField: "name",
as: "customer_info"
}
},
# 内连接只需要过滤空值即可
{
$match: { "name":{$ne:null}}
}
])
如何实现条件查询,类似于前置 where 的效果,实现如下
查询name是jack的客户信息,其中个人客户name与法人客户信息name相等
db.tb_csm_corporation.aggregate([
{
$match:{name:/jack/}
},
{
$lookup:
{
from: "tb_csm_individual",
localField: "name",
foreignField: "name",
as: "customer_info"
}
}
])
mongo索引可以很大限度加速查询速度
插入10000条数据到库中 for(i=0;i<100000;i++){db.tb_csm_corporation.insert({name:'大壮'+i,age:i})}
执行查询语句,观察用时 语句后面 +.explain(‘executionStats’)
db.tb_csm_corporation.find({name:'大壮10000'}).explain('executionStats')
新增索引,再进行查询对比
db.集合名称.createIndex({字段名:1})
;其中 1 表示升序, -1 表示降序再次执行 db.tb_csm_corporation.find({name:'大壮10000'}).explain('executionStats')
观察执行时间 发现执行时间为 0
查看当前集合索引信息 db.tb_csm_corporation.getIndexes()
删除索引信息 db.集合名称.dropIndex({'索引名称'})
创建唯一索引 db.tb_csm_corporation.createIndex({"name":1}, {"unique":true})
基本语法:mongodump -h dbhost -d dbname -o dbdirectory
最终执行语句 mongodump -h 3.2.26.244:27017 -d ACCOUNT -o ~/Desktop/ACCOUNT
基本语法: mongorestore -h dbhost -d dbname --dir dbdirectory
最终执行语句 mongorestore -h 3.2.26.244:27017 -d ACCOUNT --dir ~/Desktop/ACCOUNT
注意事项:
命名需要在终端输出,而不是数据库命令行
每个参数前后是有空格
如果执行 发现 mongodump 不是内部或外部命令,也不是可运行的程序 或批处理文件
原因:mongodb默认时没有mogodump.exe工具和mongorestore.exe工具的,所以出现了以上问题
需要下载工具: https://www.mongodb.com/try/download/database-tools
创建用户具体语法为:
use admin
db.createUser(
{
user:'account',
pwd :'account',
customData:{"desc":"create use test"},
roles:[
{
role:'userAdminAnyDatabase',db:'admin'
}
]
}
)
创建语法解析:
角色种类解析
权限 | 说明 |
---|---|
read | 允许用户读取指定数据库 |
readWrite | 允许用户读写指定数据库 |
dbAdmin | 允许用户在指定数据库中执行管理函数,如索引创建、删除、查看统计或访问system.profile |
userAdmin | 允许用户向system.users集合写入,可以在指定数据库中创建、删除和管理用户 |
clusterAdmin | 必须在admin数据库中定义,赋予用户所有分片和复制集相关函数的管理权限 |
readAnyDatabase | 必须在admin数据库中定义,赋予用户所有数据库的读权限 |
readWriteAnyDatabase | 必须在admin数据库中定义,赋予用户所有数据库的读写权限 |
userAdminAnyDatabase | 必须在admin数据库中定义,赋予用户所有数据库的userAdmin权限 |
dbAdminAnyDatabase | 必须在admin数据库中定义,赋予用户所有数据库的dbAdmin权限 |
root | 必须在admin数据库中定义,超级账号,超级权限 |
用户第一次使用,需要创建超级管理员账号,并且使用 db.auth(“root”, “root”)验证是否建立成功。
db.createUser({ user: "root", pwd: "root", roles:[{role: "root", db: "admin" }]})
db.auth("root", "root")
还需要修改mongo.conf文件,开启用户权限验证
再次登录则需要使用用户密码登录 mongo -u root -p root
案例,创建一个只对ACCOUNT库有读写权限的用户
db.createUser({user:'account',pwd:'account', roles:[{role:'readWrite',db:'ACCOUNT'}]})
db.auth("account", "account")
使用新增用户连接对应操作库 mongo -u account -p account -authenticationDatabase ACCOUNT
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>netflix-cloud</artifactId> <groupId>org.springframework.boot</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>cn.git</groupId> <artifactId>mongo-server</artifactId> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <!-- 引入mongodb--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.83</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project>
spring:
application:
name: mongo-server
# mongo 连接
data:
mongodb:
# 参数解析
# mongodb://用户名:密码@localhost:27017/库名称?authMechanism=认证方式默认就是(SCRAM-SHA-1)&authSource=具有用户凭据的集合的数据库的名称
uri: mongodb://account:account@localhost:27017/ACCOUNT?authMechanism=SCRAM-SHA-1&authSource=ACCOUNT
server:
port: 12000
注意连接具体格式:
package cn.git.mongo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @description: mongo-server服务启动类 * @program: bank-credit-sy * @author: lixuchun * @create: 2023-05-08 09:15:20 */ @SpringBootApplication public class MongoServerApplication { public static void main(String[] args) { SpringApplication.run(MongoServerApplication.class, args); } }
package cn.git.mongo.controller; import cn.git.mongo.entity.TbCsmCorporation; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Query; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; /** * @description: 法人客户信息查询controller * @program: bank-credit-sy * @author: lixuchun * @create: 2023-05-08 10:32:05 */ @Slf4j @RestController @RequestMapping("/corporation") public class TbCsmCorporationController { @Autowired private MongoTemplate mongoTemplate; /** * 主键查找 * @param id * @return */ @GetMapping("/getCorporationInfoById/{id}") public String getCorporationInfoById(@PathVariable(value = "id") String id) { TbCsmCorporation corporation = mongoTemplate.findById(id, TbCsmCorporation.class); return JSONObject.toJSONString(corporation); } /** * 修改 * @param id * @return */ @GetMapping("/updateCorporationInfo/{id}") public String updateCorporationInfoById(@PathVariable(value = "id") String id) { TbCsmCorporation corporation = mongoTemplate.findById(id, TbCsmCorporation.class); corporation.setName("张大大"); mongoTemplate.save(corporation); return JSONObject.toJSONString(corporation); } /** * 删除 * @param id * @return */ @GetMapping("/deleteCorporationInfoById/{id}") public String deleteCorporationInfoById(@PathVariable(value = "id") String id) { TbCsmCorporation corporation = mongoTemplate.findById(id, TbCsmCorporation.class); mongoTemplate.remove(corporation); return JSONObject.toJSONString(corporation); } /** * 获取所有 * @return */ @GetMapping("/getAllCorporation") public String getAllCorporation() { List<TbCsmCorporation> corporationList = mongoTemplate.findAll(TbCsmCorporation.class); log.info("获取客户信息共[{}]条", corporationList.size()); return JSONObject.toJSONString(corporationList.get(0)); } }
注意实体上面需要使用 @Document 以及 @MongoId 注解
package cn.git.mongo.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.bson.types.ObjectId; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.MongoId; /** * @description: 客户信息实体 * @program: bank-credit-sy * @author: lixuchun * @create: 2023-05-08 10:32:55 */ @Data @NoArgsConstructor @AllArgsConstructor @Document("tb_csm_corporation") public class TbCsmCorporation { /** * 主键 */ @MongoId private ObjectId id; /** * 名称 */ private String name; /** * 年龄 */ private Integer age; /** * 年龄 */ private String sex; /** * 爱好 */ private String hobby; }
访问路径 http://localhost:12000/corporation/getCorporationInfoById/6455ec140e3125acdf002e5b 查看如下结果
注意:
一个集合添加关联id时,忘记使用自定义id,使得id传值为空。
MongoDB数据库的插入mongoTemplate.insert方法,如果没有传入主键id,默认会生成ObjectId类型的主键_id。开发用String类型的id去查数据库中ObjectId类型的id就返回null了。如果使用ObjectId进行查询 语法为: mongoTemplate.findById(new ObjectId(id), 实体.class);
Criteria基本语法:
关键字 | 解释 |
---|---|
eq | 等于,第一个参数是对象属性,第二个参数是值 |
allEq | 参数为一个Map对象,相当于多个eq的叠加 |
gt | 大于 |
ge | 大于等于 |
lt | 小于 |
le | 小于等于 |
between | 在两个值之间Expression.between(“age”,new Integer(10),new Integer(20)); |
like | like查询 |
in | in查询 |
基本查询语法为
// 基本query查询,设定query
Query query = new Query();
query.addCriteria(Criteria.where("数据库字段名").is("你的参数"));
// findOne 返回的是一个对象 Class代表你的表对应的映射类
mongoTemplate.findOne(query, Class.class);
mongoTemplate.find(query, Class.class);
基本语法为
// in查询
query = new Query();
query.addCriteria(Criteria.where("id").in(Arrays.asList("6455ec9a0e3125acdf002e5e", "6455ff1bdd54537d1ac13f90")));
csmCorporationList = mongoTemplate.find(query, TbCsmCorporation.class);
log.info("query-in 查询结果[{}]!", JSONObject.toJSONString(csmCorporationList));
如果想要查询指定的数据是否在数据库的数组中,可以用以下方法
Query query = Query.query(Criteria.where(“数据库字段(数组)”).is(“你的数组”));
// 模糊查询
query = new Query();
query.addCriteria(Criteria.where("name").regex("德胜"));
csmCorporationList = mongoTemplate.find(query, TbCsmCorporation.class);
log.info("query-模糊查询 查询结果[{}]!", JSONObject.toJSONString(csmCorporationList));
// 字段选择
query = new Query();
query.fields().include("name").include("sex");
query.addCriteria(Criteria.where("id").is("6455ec9a0e3125acdf002e5e"));
csmCorporationList = mongoTemplate.find(query, TbCsmCorporation.class);
log.info("query-字段选择 查询结果[{}]!", JSONObject.toJSONString(csmCorporationList));
// 数组字段新增删除操作
query = new Query();
query.addCriteria(Criteria.where("id").is("6458943f16538a69af7f4cfb"));
// 数组中添加或删除一条数据
Update update = new Update();
// push方法可以在数组中添加一条数据
// pull方法可以在数组中删除一条数据
update.push("roomList", "0000");
mongoTemplate.updateFirst(query, update, TbCsmCorporation.class);
TbCsmCorporation corporation = mongoTemplate.findById("6458943f16538a69af7f4cfb", TbCsmCorporation.class);
log.info("query-数组操作 查询结果为[{}]!", JSONObject.toJSONString(corporation));
// todo: 不常用部分 /** * List<TbCsmCorporation> batchAddList = new ArrayList<>(); * mongoTemplate.insert(batchAddList, TbCsmCorporation.class); * * // list为复杂对象时候,查询房间编号为5的信息 * query = new Query(); * query.addCriteria(Criteria.where("roomList.$.no").is("5")); * mongoTemplate.find(query, TbCsmCorporation.class); * * // 更新时也是一样,并且带有更新条件,将房间号吗为5更新为4 * query.addCriteria(Criteria.where("roomList").elemMatch(Criteria.where("no").is("5"))); * update = Update.update("roomList.$.no", "4"); * * // 对数据库中数字字符串排序 * query.collation(Collation.of("zh").numericOrdering(true)); * // 还有根据字符串排序时又是顺序并不是我们所想的字典序,加上下面这个也ok * query.collation(Collation.of("zh")); * * // 分页 * query.limit(10); * * // 排序 * Sort sort = Sort.by(Sort.Direction.DESC, "timestamp"); * query.with(sort); */
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。