1. 程式人生 > >mongodb $sample java實現隨機取樣

mongodb $sample java實現隨機取樣

mongo查詢

db.flightAttendance.aggregate([
    {$match: { "departureDate" :{"$gte": ISODate("2018-02-13T16:00:00.000Z"),"$lte": ISODate("2018-02-16T16:00:00.000Z")}}},
    {$match: { "guestRate" :{"$gte": 60,"$lte": 80}}},
    { $sample: { size: 20 }}
])

java查詢語句

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.ceair.pss.attendance.bean.FlightAttendanceSimple;
import com.ceair.pss.attendance.util.Utils;
import com.mongodb.AggregationOutput;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { //
		"classpath*:spring/*.xml"//
})
public class SampleTest {
	@Autowired
	protected MongoTemplate mongoTemplateTest;// 測試庫
	private static SimpleDateFormat sdf_yyyyMMdd = new SimpleDateFormat("yyyy-MM-dd");

	@Test
	public void test_sample() throws ParseException {

		Date date = sdf_yyyyMMdd.parse(sdf_yyyyMMdd.format(new Date()));// 當天
		Date dateAfter = Utils.getDay(date, 1);// 最近3天

		// match
		BasicDBObject[] arrayDate = { new BasicDBObject("departureDate", new BasicDBObject("$gte", date)),
				new BasicDBObject("departureDate", new BasicDBObject("$lt", dateAfter)) };
		BasicDBObject condDate = new BasicDBObject();
		condDate.put("$and", arrayDate);

		BasicDBObject[] arrayRate = { new BasicDBObject("guestRate", new BasicDBObject("$gt", 90)),
				new BasicDBObject("guestRate", new BasicDBObject("$lte", 91)) };
		BasicDBObject condRate = new BasicDBObject();
		condRate.put("$and", arrayRate);

		DBObject matchDate = new BasicDBObject("$match", condDate);
		DBObject matchRate = new BasicDBObject("$match", condRate);
		// sample
		DBObject sample = new BasicDBObject("$sample", new BasicDBObject("size", 20));
		AggregationOutput output = mongoTemplateTest.getCollection("flightAttendance").aggregate(matchDate, matchRate, sample);
		Iterable<DBObject> list = output.results();

		List<FlightAttendanceSimple> flightAttendanceSimples = new ArrayList<FlightAttendanceSimple>();
		for (DBObject dbObject : list) {
			FlightAttendanceSimple flightAttendanceSimple = new FlightAttendanceSimple();
			flightAttendanceSimple.setArrivalAirPort(String.valueOf(dbObject.get("arrivalAirPort")));
			flightAttendanceSimple.setDepartureAirPort(String.valueOf(dbObject.get("departureAirPort")));
			String departureDate = sdf_yyyyMMdd.format((Date) dbObject.get("departureDate"));
			if (StringUtils.isNotBlank(departureDate)) {
				flightAttendanceSimple.setDepartureDate(departureDate.substring(5));
			}
			flightAttendanceSimple.setGuestRate(String.valueOf(dbObject.get("guestRate")) + "%");
			flightAttendanceSimple.setOpCarrier(String.valueOf(dbObject.get("opCarrier")));
			flightAttendanceSimple.setOpFlightNumber(String.valueOf(dbObject.get("opFlightNumber")));
			flightAttendanceSimples.add(flightAttendanceSimple);
			System.out.println(flightAttendanceSimple);
		}
	}
}