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();
个人整理资料供学习参考,如有错漏,欢迎评论指正!