pom.xml 导入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
application.properties
spring.data.mongodb.uri=mongodb://127.0.0.1:27017/test
DemoEntity.java
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable;
@Document(collection = "demo_collection")
public class DemoEntity implements Serializable {
@Id
private Long _id;
private String title;
private String description;
private String by;
private String url;
public DemoEntity(long id,String title,String description,String by,String url){
this._id = id;
this.title = title;
this.description = description;
this.by = by;
this.url = url;
}
public DemoEntity( ){
}
public Long getId() {
return _id;
}
public void setId(Long id) {
this._id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getBy() {
return by;
}
public void setBy(String by) {
this.by = by;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
DemoDao.java
import org.springframework.dao.InvalidDataAccessApiUsageException;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.List;
public interface DemoDao {
void saveDemo(DemoEntity demoEntity);
void updateDemo(DemoEntity demoEntity);
DemoEntity findDemoById(Long id);
void updateDemo(Class<?> entityClass, List<DemoEntity> list );
void updateDemo(String name, List<DemoEntity> list );
default public String determineCollectionName(Class<?> entityClass) {
if (entityClass == null) {
throw new InvalidDataAccessApiUsageException(
"No class parameter provided, entity collection can't be determined!");
}
String collName = entityClass.getSimpleName();
if(entityClass.isAnnotationPresent(Document.class)) {
Document document = entityClass.getAnnotation(Document.class);
collName = document.collection();
} else {
collName = collName.replaceFirst(collName.substring(0, 1)
,collName.substring(0, 1).toLowerCase()) ;
}
return collName;
}
}
DemoDaoImpl.java
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.mongodb.bulk.BulkWriteResult;
import org.springframework.dao.InvalidDataAccessApiUsageException;
import org.springframework.data.mongodb.core.BulkOperations;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.data.util.Pair;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
@Component
public class DemoDaoImpl implements DemoDao {
@Resource
private MongoTemplate mongoTemplate;
@Override
public void saveDemo(DemoEntity demoEntity) {
mongoTemplate.save(demoEntity);
}
@Override
public void updateDemo(DemoEntity demoEntity) {
Query query = new Query(Criteria.where("_id").is(demoEntity.getId()));
Update update = new Update();
update.set("title", demoEntity.getTitle());
update.set("description", demoEntity.getDescription());
update.set("by", demoEntity.getBy());
update.set("url", demoEntity.getUrl());
mongoTemplate.updateFirst(query, update, DemoEntity.class);
}
@Override
public DemoEntity findDemoById(Long id) {
Query query = new Query(Criteria.where("_id").is(id));
DemoEntity demoEntity = mongoTemplate.findOne(query, DemoEntity.class);
return demoEntity;
}
@Override
public void updateDemo(Class<?> entityClass,List<DemoEntity> list ) {
String collectionName = determineCollectionName(entityClass);
updateDemo(collectionName,list);
}
public void updateDemo( String collectionName,List<DemoEntity> list ) {
BulkOperations operations = mongoTemplate.bulkOps(BulkOperations.BulkMode.ORDERED,collectionName);
list.forEach(demo->{
Query query = new Query(Criteria.where("_id").is(demo.getId()));
Update update = new Update();
update.set("title", demo.getTitle());
update.set("description", demo.getDescription());
update.set("by", demo.getBy());
update.set("url", demo.getUrl());
operations.updateOne(query,update);
});
operations.execute();
}
}
MongotestApplication.java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.util.ArrayList;
import java.util.Set;
@SpringBootApplication
public class MongotestApplication implements CommandLineRunner {
Logger logger = LoggerFactory.getLogger(MongotestApplication.class);
@Autowired
DemoDao dao;
public static void main(String[] args) {
SpringApplication.run(MongotestApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
long start = System.currentTimeMillis();
var tmp = new ArrayList<DemoEntity>();
String collectionName = dao.determineCollectionName( DemoEntity.class);
for(long i = 0;i<1000000;i++){
// dao.saveDemo(new DemoEntity(i,"title " + i,"description "+i," by "+i,"url "+i));
// dao.findDemoById(i);
// dao.updateDemo(new DemoEntity(i,"title 2 " + i,"description 2 "+i," by 2 "+i,"url 2 "+i));
tmp.add(new DemoEntity(i,"title b " + i,"description b "+i," by b "+i,"url b "+i));
if(tmp.size()>=10){
dao.updateDemo(collectionName,tmp);
tmp.clear();
}
}
long end = System.currentTimeMillis();
logger.info("time = "+(end - start));
}
}
我的电脑 是
windos10 / mongodb 默认 配置
1,000,000 数据 测试 时间 为毫秒。
function count time _id 为自定义id DemoDao.saveDemo 1,000,000 154,411/163,817/155,518 DemoDao.findDemoById 1,000,000 129,393/148,912 133,718/138,909 DemoDao.updateDemo 1,000,000 185,295/142,472 168,553/158,445 批量 function count onece time DemoDao.updateDemo 1,000,000 1 156,580 DemoDao.updateDemo 1,000,000 10 55,123 DemoDao.updateDemo 1,000,000 50 55,123 DemoDao.updateDemo 1,000,000 100 51,987 DemoDao.updateDemo 1,000,000 500 35,560/34,213/50,586/50,608 DemoDao.updateDemo 1,000,000 1,000 49,833 DemoDao.updateDemo 1,000,000 10,000 51,361