Springboot整合MongoDB数据库操作

Springboot整合MongoDB数据库操作

一、新增

1. 单条新增

  • Document操作

Document document = Document.parse(JSONUtil.toJsonStr(dto));
document.put("_id", IdUtil.objectId());
document.put("createTime", new Date());
​
mongoTemplate.getCollection(collectionName).insertOne(document)

可以在调用.wasAcknowledged()方法获取数据插入的结果

注意:

MongoDB在不额外添加的情况下会产生“_id”字段,但字段类型为ObjectId,不是String!

  • 实体类操作

mongoTemplate.save(entity,collectionName);
mongoTemplate.insert(comment,collectionName);

该方法会返回你插入的实体类对象

2. 批量新增

  • Document操作

List<Document> documents;
mongoTemplate.getCollection(collectionName).insertMany(documents).wasAcknowledged()
  • 实体类操作

 mongoTemplate.insert(list,collectionName);

3.insert与save的区别

save()方法:save()方法用于插入新文档或更新现有文档。如果要保存的文档没有id字段,将插入一个新文档。如果文档具有id字段,MongoDB将尝试使用匹配的id值更新文档。

insert()方法:insert()方法用于向集合中插入新文档。如果要插入的文档已经具有id字段,并且集合中已经存在具有相同id值的文档,则会抛出异常。

注意:save()方法用于插入和更新操作,而insert()方法只能用于插入,并确保_id字段的唯一性。

二、删除

1. 删除单条符合条件的文档

  • Document操作

 Document document = new Document();
 document.put(field, value);

long result =        mongoTemplate.getCollection(collectionName).deleteOne(query).getDeletedCount();
  • Criteria操作

Query query = new Query(Criteria.where(filed).is(value));
 
Entity entity = mongoTemplate.findAndRemove(query, Entity.class);

2.删除满足条件的所有文档

  • Document操作

String[] ids;
​
Document document = new Document();
​
document.put("_id",new Document().append("$in",Arrays.stream(ids).collect(Collectors.toList())));
        
mongoTemplate.getCollection(collectionName).deleteMany(query).getDeletedCount();
  • Criteria操作

  //直接删除
  Query query = new Query(Criteria.where(“id”).in(ids));
​
  DeleteResult remove = mongoTemplate.remove(query, collectionName);
​
//查找并删除,返回删除的文档
 List<Entiy> list = mongoTemplate.findAllAndRemove(new Query(Criteria.where("userId").is(3)), Entity.class,collectionName);
​

三、修改

1. 修改符合条件的第一条数据

  • Document操作

Document update = new Document();
update.put("$set", new Document("status", -1));
// Document pullDocument = new Document("$pull", new Document("subscribe", subscribe));
Document query = new Document();
query.put("_id",id);
​
long result = mongoTemplate.getCollection(collectionName).updateOne(query, update).getModifiedCount();
  • Criteria操作

Query query = new Query(Criteria.where("id").is(id));
Update update = new Update().set(field1,value1).set(field2,value2);
 
UpdateResult updateResult = mongoTemplate.updateFirst(query, update, collectionName);
​

2.修改符合条件的所有数据

  • Document操作

Document query = new Document();
queryPoint.append(field, value);
Document update = new Document("$set", new Document(field, value))
mongoTemplate.getCollection(collectionName).updateMany(query, update).wasAcknowledged();
​
  • Criteria操作

Query query = new Query(Criteria.where(field).is(value));
Update update = new Update().set(field1,value1).set(field1,value1);
 
UpdateResult updateResult = mongoTemplate.updateMulti(query, update, Comment.class,collectionName);
​

四、查询

1.查询满足条件的一条文档

  • Document操作

//查询条件
BasicDBObject query = new BasicDBObject();
query.put(field, value);
        
//需要显示的字段,为空全显示
 BasicDBObject dbObject = new BasicDBObject();
            dbObject.putAll(queryMap);
mongoTemplate.getCollection(collectionName).find(query).sort(Sorts.descending("createTime")).first();.projection(dbObject).first();
  • Criteria操作

 mongoTemplate.findOne(new Query(Criteria.where(field).is(value)),Entity.class,collectionName);

2.查询满足条件的所有文档

  • Document操作

BasicDBObject object = new BasicDBObject();
object.put(field,value);
FindIterable<Document> findIterable = mongoTemplate.getCollection(collName).find(query).allowDiskUse(true);
  • Criteria操作

List<Entity> list = mongoTemplate.find(new Query(Criteria.where(field).is(value)),Entity.class,collName);
​

3.统计查询

  • Document操作

List<Document> queryList = Lists.newArrayList();
Document query = new Document(field, new Document("$all", queryList)));
long count = mongoTemplate.getCollection(collectionName).countDocuments(query)
  • Criteria操作

Query query = new Query(Criteria.where(field).is(value));
long count = mongoTemplate.count(query, Entity.class,collectionName)

4.Criteria的内置方法

1. and关联

 Criteria criteria1 = Criteria.where(field1).is(value1);
 Criteria criteria2 = Criteria.where(field2).is(value2);
 
// 2.将上面条件进行and关联
Criteria criteria = new Criteria().andOperator(criteria1, criteria2);
​

2. Or关联

与and写法一致

Criteria criteria = new Criteria().orOperator(criteria1, criteria2);

3. In查询

Criteria criteria = Criteria.where(field).in(values)

4. 比较查询

Criteria.where(field).gt(min).lt(max)

5. 正则查询

Criteria.where(field).regex(regex)

6. 排序查询

criteria.with(Sort.by(field).descending());//降序,默认升序

7. 分页查询

criteria.skip(page).limit(size)

五、聚合查询

//先关联
LookupOperation lookupOperation = LookupOperation.newLookup().
                from(collName).
                localField(localField).
                foreignField(foreignField).
                as(newName);
//构建投影
 ProjectionOperation projectionOperation = Aggregation.project().andInclude(fieldNames).
 .and(foreignFieldName).arrayElementAt(0).as(newName);
//聚合
 Aggregation aggregation = Aggregation.newAggregation(
                lookupOperation, 
                Aggregation.match(criteria),//关联后筛选
                Aggregation.group("school").sum("score").as("total")//分组字段
                .first("name").as("name"),//映射其他字段
                .first("phone").as("phone"),//映射其他字段                 
                projectionOperation,
                Aggregation.skip(page),//分页
                Aggregation.limit(pageSize),
                Aggregation.sort(Sort.by(Sort.Order.desc("addTime")))
        );
​
//执行查询
AggregationResults<Entity> results = mongoTemplate.aggregate(aggregation, collectionName, Entity.class);
 List<Entity> list = results.getMappedResults();

个人整理资料供学习参考,如有错漏,欢迎评论指正!

  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在 Spring Boot 中,我们可以使用 `MongoTemplate` 来操作 MongoDB 数据库。如果需要切换数据库,可以通过配置多个 `MongoClient`,然后再使用不同的 `MongoTemplate` 来操作不同的数据库。 下面是一个示例,演示如何在 Spring Boot 中切换 MongoDB 数据库: 首先,需要在 `application.properties` 配置文件中添加多个 MongoDB 连接信息: ``` # 第一个 MongoDB 连接 spring.data.mongodb.uri=mongodb://localhost:27017/db1 # 第二个 MongoDB 连接 mongodb2.uri=mongodb://localhost:27017/db2 mongodb2.database=db2 ``` 然后,在代码中可以通过 `MongoClientFactoryBean` 创建多个 `MongoClient`: ```java @Configuration public class MongoConfig { @Bean public MongoClientFactoryBean mongo() { MongoClientFactoryBean mongo = new MongoClientFactoryBean(); mongo.setHost("localhost"); return mongo; } @Bean public MongoTemplate mongoTemplate() throws Exception { return new MongoTemplate(mongo(), "db1"); } @Bean(name = "mongo2") public MongoTemplate mongoTemplate2() throws Exception { MongoClientURI uri = new MongoClientURI("mongodb://localhost:27017/db2"); MongoTemplate mongoTemplate = new MongoTemplate(new MongoClient(uri), "db2"); return mongoTemplate; } } ``` 上面的示例中,`mongoTemplate()` 方法创建了一个 `MongoTemplate` 对象来操作名为 `db1` 的数据库,而 `mongoTemplate2()` 方法则创建了一个 `MongoTemplate` 对象来操作名为 `db2` 的数据库。 在需要使用的地方,可以通过 `@Qualifier` 注解注入不同的 `MongoTemplate`: ```java @Service public class MyService { @Autowired private MongoTemplate mongoTemplate; @Autowired @Qualifier("mongo2") private MongoTemplate mongoTemplate2; // ... } ``` 这样就可以在代码中切换不同的 MongoDB 数据库了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值