MongoDB初见-基础使用
原生语法使用
添加
使用 insert() 或 save() 方法向集合中插入文档
1
db.表名.insert(document);
1
2db.hello.insert({"title":"1","likes":1});
db.hello.save({"title":"2","likes":2});1
2
3// 指定id更新对应id的数据
db.hello.save({"title":"6","likes":6});
db.hello.find({"title":"6"});1
db.hello.save({'_id':ObjectId("603caed56a230000ef001b3e"),"title":"6","likes":12})
如果使用save(),不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据;
修改
使用insert()或save()方法来更新集合中的文档。
1
2
3
4
5
6
7
8db.col.update(
<query>, // update的查询条件
<update>, // sql update查询内set后面的
{
upsert: <boolean>, // 可选,默认false,如果为true,当update数据不存在时则插入新数据
multi: <boolean> // 可选,默认false,只更新条件找到的第一条记录,如果未true,更新所有
}
)
1 | db.hello.update({ |
1 | // 9不存在 执行后插入一条新纪录 |
1 | // 7存在多条 likes会批量更新成14 |
删除
1 | db.collection.remove( |
1 | // 只删除一条 |
查询
1 | db.collection.find( |
1 | // projection:key:1/0,当key为1时显示该字段否则隐藏 |
比较
操作 | 格式 | eg. | sql |
---|---|---|---|
等于 | {<key>:<value> } |
db.hello.find({"title":"MongoDB"}).pretty() |
where title = 'MongoDB' |
小于 | {<key>:{$lt:<value>}} |
db.hello.find({"likes":{$lt:50}}).pretty() |
where likes < 50 |
小于或等于 | {<key>:{$lte:<value>}} |
db.hello.find({"likes":{$lte:50}}).pretty() |
where likes <= 50 |
大于 | {<key>:{$gt:<value>}} |
db.hello.find({"likes":{$gt:50}}).pretty() |
where likes > 50 |
大于或等于 | {<key>:{$gte:<value>}} |
db.hello.find({"likes":{$gte:50}}).pretty() |
where likes >= 50 |
不等于 | {<key>:{$ne:<value>}} |
db.hello.find({"likes":{$ne:50}}).pretty() |
where likes != 50 |
AND和Or
1 | // And操作 |
1 | // Or操作 |
1 | db.hello.find({ |
Limit和Skip的分页
1 | db.col.find().limit(NUMBER).skip(NUMBER); // skip的默认方法为0 |
Sort排序
1 | db.col.find().sort({KEY:1}) // Key为需要排序的字段,1正序,-1倒叙 |
- 当limit,skip,sort同时使用,执行顺序是sort>skip>limit
索引操作
1 | db.collection.createIndex( |
参数 | 值 | 解释 |
---|---|---|
background | true/false | 默认false,当为true后台执行 |
unique | true/false | 默认false,当为true指定唯一索引 |
name | string | 索引自定义名字,未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。 |
Java应用
添加数据源依赖
1
2
3
4<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>添加配置
1
2
3
4
5spring:
data:
mongodb:
uri: mongodb://xxxxxx
database: test更改实体bean 添加
@Document("集合名")
注解,方便后续使用引入
MongoTemplate
简单查询
构建查询条件
1
Query query = new Query();
查询的两个常用
with()
方法分页
1
2
3
4// 1. 只分页
query.with(PageRequest.of(pageNumber, pageSize));
// 2. 分页+排序
query.with(PageRequest.of(pageNumber, pageSize, Sort.by(Sort.Direction.DESC, "排序字段")));排序
1
2// Sort.Direction 区分正序还是倒序
query.with(Sort.by(Sort.Direction.DESC, "排序字段"));
添加查询条件
1
2
3
4// 1. 初始化
Query query = new Query(Criteria.where(""));
// 2. add
query.addCriteria(Criteria.where(""));Java Sql Criteria.where(“id”).is(id); id = id Pattern.compile(“^.“ + text + “.$”, Pattern.CASE_INSENSITIVE);
Criteria.where(“id”).regex(pattern);id like ‘%text%’ Criteria.and(“createAt”).gte(startTime).lte(endTime); createAt >= startTime and createAt <= endTime
| Criteria.and(“status”).nin(“SUCCESS”, “FAILURE”);
Criteria.and(“status”).in(“SUCCESS”); | status not in (“SUCCESS”, “FAILURE”)
status in (“SUCCESS”) |
| Criteria.orOperator(Criteria.where(“orderId”).is(1), Criteria.where(“externalOrderId”).is(2)); | and (orderId = 1 or externalOrderId = 2) |
执行查询
1
mongoTemplate.find(query, xxx.class);
聚合查询
分页
1
2
3
4
5List<AggregationOperation> operations = new ArrayList<>(2);
operations.add(Aggregation.skip((Math.max(pageNo, 1) - 1) * pageSize));
operations.add(Aggregation.limit(pageSize));
// 执行查询获取结果
mongoTemplate.aggregate(Aggregation.newAggregation(inClazz, operations), outClazz).getMappedResults();为聚合查询添加查询条件
1
2
3
4
5// 通过Aggregation.match添加查询条件,因为是作为operations,所以可以传入多个 执行的时候
List<AggregationOperation> operations = new ArrayList<>();
operations.add(Aggregation.match(andCriteria));
...
// 执行后的结果如下图映射字段,当操作聚合数据的时候,如果涉及到分组求和等操作,这个操作必须进行字段映射,类似于sql的select a,b,c
1
Aggregation.project("字段名");
project的函数表达式
1
2
3
4// 这个的操作结果相当于 ifnull() 函数
project.and("rechargeValue").applyCondition(ConditionalOperators.IfNull.ifNull("rechargeValue").thenValueOf("product.rechargeValue")));
// 相当于 (serPrice - costPrice) as subUserCostPrice
project.and("userPrice").minus("costPrice").as("subUserCostPrice");Group分组
1
2
3
4
5
6
7// 根据字段分组
GroupOperation group = Aggregation.group(数组);
// 求和 a as sumCount
group.count().as("sumCount");
// 判断求和 case when then else end
group.sum(ConditionalOperators.when(Criteria.where("aa").is(RechargeOrderStatusEnum.FAILURE))
.then(1).otherwise(0)).as("bb");
更新
1 | // 只更新匹配的第一条数据 |
工具类
1 | import com.google.common.collect.Lists; |
1 | import lombok.Data; |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 野生Java程序员兼美食博主!
评论