mongo分组查询问题以及mongo根据Date类型查询

2023-12-15 15:31:26

一、mongo分组查询

mongo中如果只是根据条件查询数据,则只需要:

db.getCollection('表名').find({'source':{$eq:'5'}})

如果根据字段进行分组查询,那么需要用aggregate传一个数组进行查询,如

db.getCollection('表名').find({ "$and" : [{ "startTime" : { "$gt" : new Date(1702296000837) } }, { "startTime" : { "$lt" : new Date(1702382400838) } }, { "source" : { "$eq" : "5" } }] })

在Java代码中怎么实现分组查询呢?

我们需要使用BasicDBObject构建四个对象,分别是match(查询条件)、project(展示字段)、group(分组信息获取)、sort(根据什么字段排序)才能实现分组查询

1、查询条件构造 match

{ "$match" : { "$and" : [{ "startTime" : { "$gte" : { "$date" : 1676721600504 } } }, { "startTime" : { "$lte" : { "$date" : 1702641600504 } } }] } }

代码实现:

BasicDBObject st = new BasicDBObject("$gte", new Date());
BasicDBObject et = new BasicDBObject("$lte", new Date());
BasicDBObject startTime = new BasicDBObject("createDate",st);
BasicDBObject endTime = new BasicDBObject("createDate",et);? //相当于 createDate<=时间1?and createDate >= 时间2

BasicDBList list = new BasicDBList();
list.add(startTime);
list.add(endTime); //如果有其他的条件再继续添加

2、构建分组,以及分组的内容

{ "$group" : { "_id" : "$agentId", "list" : { "$push" : { "sId" : "$sId", "title" : "$title", "status" : "$status"} } } }

这相当于用agentId字段进行分组,然后在list字段插入分组的每一条明细信息,如果要把整条明细字段都保留,插入到list集合中,那需要将红色字段修改从$$ROOT (需要mongo版本支持)

代码实现:

BasicDBObject group= new BasicDBObject();
groupFields.put("_id", "$ccodAgentId");
BasicDBObject show = new BasicDBObject();
show.put("custId","$custId");
show.put("status","$status");
group.put("list", new BasicDBObject("$push", show));

3、构建查询筛选展示字段 project

BasicDBObject project= new BasicDBObject("_id", 1);
project.put("list", 1);

注意 这相当于从mongo表中查询筛选,最后保留下来哪些字段,这里最后展示的是_id、list两列

(要注意project在aggregate数组中的位置,如果这里project放在group的前面,那么就查不出其他字段了)

代码实现:

BasicDBObject project= new BasicDBObject("_id", 1);
project.put("list", 1);

4、构建排序

{ "$sort" : { "_id" : 1 } }

根据_id字段进行排序,1是正序,-1是反序

代码实现:

BasicDBObject sortBy = new BasicDBObject();

sortBy.put("startTime", 1);

最后查询:

List<DBObject> pipeline = new ArrayList<DBObject>();
pipeline.add(match);

pipeline.add(group);
pipeline.add(fields);
pipeline.add(sort);

//指定聚合的输出格式为CURSOR

AggregationOptions build = AggregationOptions.builder().outputMode(AggregationOptions.OutputMode.CURSOR).build();

Iterator<DBObject> it =?mongoTemplate.getCollection(collectionName).aggregate(pipeline,build);

文章来源:https://blog.csdn.net/qq_41838901/article/details/134996142
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。