here is the example:
1. model
package com.eifesun.monitor.web.model; import java.io.Serializable; import java.util.concurrent.TimeUnit; import org.joda.time.DateTime; import org.joda.time.LocalDate; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Transient; import org.springframework.data.mongodb.core.index.Indexed; import org.springframework.data.mongodb.core.mapping.Document; import com.eifesun.monitor.DeviceType; import com.eifesun.monitor.inverter.power_20k.ErrorCode; @Document(collection = "alarm_logs") public class AlarmLogs implements Serializable { private static final long serialVersionUID = 1L; @Id private long id; @Indexed private long alarmDate; private String deviceType; private String clientId; private String errorType; private int errorValue; private long startDate; private long cleanDate; @Transient private final String dateParten = "MM/dd/yyyy h:mm"; @Transient private String name; public AlarmLogs() { } public AlarmLogs(DeviceType deviceType, String clientId, String errorType, int errorValue) { this.deviceType = deviceType.toValue(); this.clientId = clientId; this.errorType = errorType; this.errorValue = errorValue; this.startDate = DateTime.now().getMillis(); this.alarmDate = new LocalDate().toDateTimeAtStartOfDay().getMillis(); } public String getStartDate() { return new DateTime(startDate).toString(dateParten); } public void setStartDate(long startDate) { this.startDate = startDate; } public boolean getAlarmIsCleaned() { return this.cleanDate != 0; } /** * get alarm remain period time (unit: minute) * * @return */ public long getAlarmRemainedTime() { if (getAlarmIsCleaned()) { return TimeUnit.MILLISECONDS.toMinutes(cleanDate - startDate); } else { return TimeUnit.MILLISECONDS.toMinutes(DateTime.now().getMillis() - startDate); } } public void setCleanDate(long cleanDate) { this.cleanDate = cleanDate; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public void setAlarmDate(DateTime alarmDate) { this.alarmDate = alarmDate.getMillis(); } public String getDeviceType() { return deviceType; } public void setDeviceType(String deviceType) { this.deviceType = deviceType; } public String getErrorMessage() { return ErrorCode.getType(errorType).getDescription(errorValue); } public String getErrorType() { return errorType; } public int getErrorValue() { return errorValue; } public String getClientId() { return clientId; } public void setClientId(String clientId) { this.clientId = clientId; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
2.db Repository
package com.eifesun.monitor.web.repository; import static org.springframework.data.domain.Sort.Direction.DESC; import static org.springframework.data.mongodb.core.query.Criteria.where; import static org.springframework.data.mongodb.core.query.Query.query; import java.util.List; import org.joda.time.DateTime; import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.stereotype.Repository; import com.eifesun.monitor.web.model.AlarmLogs; @Repository public class AlarmLogsRepositoryImpl extends SequenceRepostory implements AlarmLogsRepository { public void setMongo(MongoTemplate mongo) { this.mongo = mongo; } @Override public List<AlarmLogs> findAlarmLogs(DateTime date, int lastId) { //@formatter:off final List<AlarmLogs> alarmlogs = mongo.find( query(where("startDate").gte(date.getMillis()). and("_id").gt(lastId)). with(new Sort(DESC, "_id")). limit(100), AlarmLogs.class); //@formatter:on return alarmlogs; } @Override public void save(AlarmLogs logs) { logs.setId(getNextSequence("alarm_logs")); mongo.save(logs); } }
abstract repostroy for sequence fetch
@Repository public abstract class SequenceRepostory { @Autowired protected MongoTemplate mongo; public abstract void setMongo(MongoTemplate mongo); public long getNextSequence(String collectionName) { final Counter counter = mongo.findAndModify(query(where("_id").is(collectionName)), new Update().inc("seq", 1), options().returnNew(true), Counter.class); return counter.getSeq(); } }
3. repostory unit test
package com.eifesun.mornitor.server; import static com.lordofthejars.nosqlunit.mongodb.MongoDbRule.MongoDbRuleBuilder.newMongoDbRule; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import java.util.List; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.data.mongodb.config.AbstractMongoConfiguration; import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.eifesun.monitor.web.command.AlarmQueryType; import com.eifesun.monitor.web.model.AlarmLogs; import com.eifesun.monitor.web.repository.AlarmLogsRepositoryImpl; import com.foursquare.fongo.Fongo; import com.lordofthejars.nosqlunit.annotation.UsingDataSet; import com.lordofthejars.nosqlunit.core.LoadStrategyEnum; import com.lordofthejars.nosqlunit.mongodb.MongoDbRule; import com.mongodb.Mongo; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration public class AlarmLogsRepositoryTest { @Autowired private ApplicationContext applicationContext; @Autowired private AlarmLogsRepositoryImpl alarmRepo; @Rule public MongoDbRule mongoDbRule = newMongoDbRule().defaultSpringMongoDb("mongodb-test"); @Test @UsingDataSet(locations = {"testFindAlarmLogs.json"}, loadStrategy = LoadStrategyEnum.CLEAN_INSERT) public void testFindAlarmLogs() { List<AlarmLogs> list = alarmRepo.findAlarmLogs(AlarmQueryType.AUTO.getAlarmDate(), 0); assertThat(list.size(), equalTo(4)); } @Configuration @EnableMongoRepositories @ComponentScan(basePackageClasses = {AlarmLogsRepositoryImpl.class}) @PropertySource("classpath:application.properties") static class RepositoryTestConfiguration extends AbstractMongoConfiguration { @Override protected String getDatabaseName() { return "mongodb-test"; } @Override public Mongo mongo() { return new Fongo("mongo-test").getMongo(); } @Override protected String getMappingBasePackage() { return "com.eifesun.monitor.web.model"; } } }
enjoy it.