芝麻分从本地mongo中获取有效数据工具
2017-01-16 22:03
459 查看
引言:
起因:java接入芝麻分,接口数据为了提高效率,需要储存在mongo中,若接口调用则优先从本地mongo库中查询是否存在有效数据。mongo查询:
import com.alibaba.fastjson.util.TypeUtils; import com.lemon.datamarket.dao.mongo.ManageRepository; import com.lemon.datamarket.model.DataTransferObject; import com.lemon.datamarket.utils.MongoDBUtils; import com.lemon.datamarket.utils.zhima.AliConstants; import com.lemon.datamarket.utils.zhima.DateUtils; import com.mongodb.MongoClient; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoCursor; import org.bson.Document; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.text.ParseException; import java.util.Date; import java.util.LinkedHashMap; import java.util.Map; /** * Created by zhoudazhuang * Date: 17-1-13 * Time: 下午3:14 * Description : ali Mongo 仓库操作 */ @Component public class AliRepository { @Autowired private MongoDBUtils mongoDBUtils; @Value("${mongo.db_name}") private String databaseName; @Resource private ManageRepository manageRepository; /** * 保存集合 * @param collectionName * @param poJo */ public void save(String collectionName,Object poJo){ TypeUtils.compatibleWithJavaBean = true; manageRepository.save(collectionName,poJo); } /** * 芝麻信用分接口本地查询 * @param dataTransferObject * @param type 0 手机号入参 1 姓名 身份证入参 * @return */ public Map<String,Object> zhimaCreditScoreQuery(DataTransferObject dataTransferObject,int type) throws ParseException { //实例化mongoClient MongoClient mongoClient = mongoDBUtils.getMongoClient(); //获取mongo集合入口 MongoCollection<Document> mongoCollection = mongoClient.getDatabase(databaseName).getCollection(AliConstants.MARKET_ALI_ZHIMACREDITSCOREQUERY_MONGOCOLLECTION_NAME); //芝麻信用分的数据最大有效期一个月 long threshold = System.currentTimeMillis() - 30 * 24 * 60 * 60 * 1000L; //实例化查询对象 并组装查询参数 Document queryDocument = new Document(); if(0 == type){//要求手机号进行查询 queryDocument.append("phone", dataTransferObject.getPhone()).append("createTime", new Document().append("$gt", threshold)); }else if(1 == type){ queryDocument.append("name",dataTransferObject.getName()).append("idCard",dataTransferObject.getIdCard()).append("createTime",new Document().append("$gt", threshold)); } //获得FindIterable FindIterable<Document> findIterable = mongoCollection.find(queryDocument).limit(1);//只使用第一条记录 MongoCursor<Document> mongoCursor = findIterable.iterator(); Map<String,Object> data = null; //遍历FindIterable并组装对象 if (mongoCursor.hasNext()) { //如果存在则实例化过滤规则 Date starttime = DateUtils.getMonthByNow(-1);//获取上个月6号 2016-12-06 00:00:00 Date thisdate = DateUtils.getMonthByNow(0); //获取当前月6号 2016-1-06 00:00:00 Date deadline = DateUtils.getMonthByNow(+1);//获取下一个6号 2016-2-06 00:00:00 //判断当前时间区间范围 Boolean bone =DateUtils.isBetweenDate(starttime,thisdate); Boolean btwo =DateUtils.isBetweenDate(thisdate,deadline); if(bone == true){//当前时间未超过当月6号 Document document = mongoCursor.next(); data = new LinkedHashMap<String,Object>(); data.put("result", document.get("result")); data.put("openId", document.get("open_id")); } if(btwo == true){//当前时间已超过当月6号 Document document = mongoCursor.next(); //获取数据存储时间 Date datatime = new Date(document.getLong("createTime")); if(DateUtils.isBetweenDateplus(thisdate,datatime,deadline)){ data = new LinkedHashMap<String,Object>(); data.put("result", document.get("result")); data.put("openId", document.get("open_id")); } } } mongoCursor.close(); return data; } }
java处理时间的工具类:
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * Created by zhoudazhuang * Date: 17-1-17 * Time: 上午10:54 * Description :阿里时间处理 */ public class DateUtils { public static void main(String[] args) { Date starttime = DateUtils.getMonthByNow(-1);//获取上个月6号 2016-12-06 00:00:00 Date thisdate = DateUtils.getMonthByNow(0); //获取当前月6号 2016-1-06 00:00:00 Date deadline = DateUtils.getMonthByNow(+1);//获取下一个6号 2016-2-06 00:00:00 Boolean b1 = DateUtils.isBetweenDate(starttime,thisdate); Boolean b2 = DateUtils.isBetweenDate(thisdate,deadline); System.out.println(b1); System.out.println(b2); } /** * 对比当前时间是否在指定区间内 * @param starttime starttime < now time < deadline * @param deadline * @return */ public static boolean isBetweenDate(Date starttime,Date deadline){ Date date = new Date();//需要修改这里为mongo拿出的芝麻数据存入时间 if(date.after(starttime) && date.before(deadline)){ return true; } return false; } /** * 对比第二个时间是否在指定第一个和最后一个区间内 * @param starttime starttime < now time < deadline * @param deadline * @return */ public static boolean isBetweenDateplus(Date starttime,Date standertime,Date deadline){ if(standertime.after(starttime) && standertime.before(deadline)){ return true; } return false; } /** * 获取指定月的6号 * @param month -1 从当前月减一月 +1 从当前月加一月 * @return */ public static Date getMonthByNow(int month){ SimpleDateFormat simpleDateFormatMM = new SimpleDateFormat("yyyy-MM"); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Calendar c = Calendar.getInstance(); c.setTime(new Date()); c.add(Calendar.MONTH, month); Date mb = c.getTime(); String mon = simpleDateFormatMM.format(mb); StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append(mon).append("-06 0:0:0"); System.out.println(stringBuffer.toString()); Date date = null; try { date = simpleDateFormat.parse(stringBuffer.toString()); } catch (ParseException e) { e.printStackTrace(); } return date; } }
附录
这里记录下mysql的时间以及order by,包括int,varchar,timestamp,data
表:
DROP TABLE IF EXISTS `test`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `test` ( `id` int(11) NOT NULL, `time` varchar(45) DEFAULT NULL, `timestamp` timestamp NULL DEFAULT NULL, `date` date DEFAULT NULL, `str` varchar(45) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
测试sql
SELECT * FROM chargeManager.test; set sql_safe_updates = 0; select unix_timestamp('2009-10-26 10-06-07'); UPDATE `chargeManager`.`test` SET `timestamp`=1256522767 WHERE `id`='1'; SELECT * FROM chargeManager.test where str >2 order by id desc;#int SELECT * FROM chargeManager.test where date > '2009-10-26' order by time desc;#varchar date > 需要 ‘’ SELECT * FROM chargeManager.test where time > 100 order by test.timestamp desc;#timestamp SELECT * FROM chargeManager.test where id>1 order by test.date desc;
注:varchar中若为”123”等数字类型字符串,则类int排序,而timestamp插入时间戳,由于在时间戳的存储中常用int或varchar,所以注意若使用sql操作timestamp时,传入的需为datatime类型,既不是int,也不是varchar.
相关文章推荐
- ExtJS中从WebService获取数据保存到本地,填充GridPanel实现静态数据分页
- U6数据导出工具项目总结三 鼠标单击或者双击DataGridView控件时获取鼠标点击位置的值
- fiddler2调试工具脚本--本地假数据及远程调用
- Linux本地自动获取root权限工具
- Http Get 从服务器中获取数据 存储到本地
- [原创]c#编写-获取Infopath数据中的图片工具
- jquery easyui combogrid 获取本地数据并设默认值
- 使用mysql备份工具innobackupex将本地数据直接备份到远端服务器、备份、恢复操作实例
- 使用mysql备份工具innobackupex进行本地数据备份、恢复操作实例
- 自动完成下拉框 Select2 关键字搜索的实例(本地数据与异步获取)
- 判断GPS获取的数据是否为有效数据
- java中如何获取远程计算机post提交的数据并把这些数据写入本地的txt文件中
- 推荐制作精良的笔记软件Wire Note 应用键盘钩子技术获取即时数据 资料查阅的好工具 建立代码片段数据库
- 使用mysql备份工具innobackupex将本地数据 直接恢复 到远端服务器数据目录操作实例
- WayOs获取WAN口帐号等设置数据并提交工具全面支持固定IP模式,一键式提交,让您重装路由更轻松
- 将Catia数据转成Inventor本地数据的工具:Mesh Enabler
- 从输入流中获取数据并以字节数组返回,这种输入流可以来自Android本地也可以来自网络
- JPA 本地查询,结果数据获取错误
- 前端在本地模拟跨域获取后端数据
- pyhton 从web获取json数据 保存到本地然后再读取