日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Mongodb利用aggregation实现抽样查询(按记录数和时间)

發(fā)布時間:2025/3/21 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mongodb利用aggregation实现抽样查询(按记录数和时间) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

  之前對mongodb不熟,但是項目要用,因為數(shù)據(jù)量比較大,并且領導要實現(xiàn)抽樣查詢,控制數(shù)據(jù)流量,所以自己研究了下,親測可用,分享一下!

  話不多說,上代碼:

  第一種方案:加自增主鍵,實現(xiàn)按記錄數(shù)抽樣  

  1、記錄在存入數(shù)據(jù)庫時不適用默認id,改為自增id,具體實現(xiàn)如下:

  

/*** 序列類,用于映射查詢的序列值* @author Administrator**/ public class MongoSequence {@Idprivate String id;private int seq;}

  

/*** 獲取序列號工具類* @author Administrator**/ @Component public class MongoAutoidUtil {@AutowiredMongoTemplate mongoTemplate;public int getNextSequence(String collectionName) {Query query = new Query(Criteria.where("collName").is(collectionName));Update update = new Update();update.inc("seq", 1);FindAndModifyOptions options = new FindAndModifyOptions();options.upsert(true);options.returnNew(true);MongoSequence seqId = mongoTemplate.findAndModify(query, update, options, MongoSequence.class);return seqId.getSeq();}} //插入數(shù)據(jù) public void insert(DeviceData110 de) {de.setId(mongoAutoidUtil.getNextSequence(de.getParamName())); mongoTemplate.save(de,de.getParamName());}

  2、查詢數(shù)據(jù),具體實現(xiàn)如下:

@Autowiredprivate MongoTemplate mongoTemplate;public List<DeviceData110> find() {ProjectionOperation dateProjection = Aggregation.project("_id","paramName","retrieveTime");MatchOperation match1 = Aggregation.match(new Criteria("paramName").is("aaa"));MatchOperation match2 = Aggregation.match(new Criteria("retrieveTime").gte(DateUtil.getAssignTime(new Date(), -1)).lte(DateUtil.getAssignTime(new Date(), 1)));MatchOperation match3 = Aggregation.match(new Criteria("_id").mod(2, 0));Aggregation agg = Aggregation.newAggregation(dateProjection,match1,match2,match3);AggregationResults<DeviceData110> results = mongoTemplate.aggregate(agg,"aaa",DeviceData110.class);List<DeviceData110> list = results.getMappedResults();return list;}

  

//實體類 public class DeviceData110 implements Serializable{private static final long serialVersionUID = -4763630558724084819L;public int id;public String paramName;public Date retrieveTime; }

  在demo中可以查詢到按paramName為"aaa",retrieveTime為一天前至今,并且id值除以2余數(shù)為0的所有記錄,更改除數(shù)的大小便實現(xiàn)了不同粒度的抽樣查詢。

  第二種方案:借助 date aggragation ,實現(xiàn)按時間查詢

  前提是被查詢數(shù)據(jù)中有字段為iso date類型retrieveTime,然后在aggregation中加入一個這樣的MatchOperation,最后加入到Aggregation.newAggregation()即可實現(xiàn)查詢分鐘數(shù)為0,15,30,45的記錄,同時支持的其它操作還有hour、seconds等。

ProjectionOperation project1 = Aggregation.project("_id").andExpression("minute(retrieveTime)").as("minute"), MatchOperation match = Aggregation.match(new Criteria("minute").in("0","15","30","45")); Aggregation agg = Aggregation.newAggregation(project1 、match );

  

?

  

轉(zhuǎn)載于:https://www.cnblogs.com/hhhshct/p/8426068.html

總結

以上是生活随笔為你收集整理的Mongodb利用aggregation实现抽样查询(按记录数和时间)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。