MongoDB聚合操作

Mongo日常操作记录

工作中涉及到的mongo操作(查询、更新、删除、聚合、杀死长时间执行的命令)。

查询操作

脚本

	db.collectionName.find({stat_time:{$lte:new Date('2021-04-01 00:00:00')}}).sort({stat_time:-1}).limit(pageSize).skip((pageNo - 1) * pageSize)

根据ID查询

db.collection.find({_id:ObjectId('632a9579cf1181536660c2f1')})

根据日期查询

db.collection.find({createTime:{$gt:new Date("2022-09-21 10:00:00")}})

java代码

	//分页查询代码
	Criteria criteria = Criteria.where("status").is('2');
    Query query = new Query();
    query.addCriteria(criteria);
    query.skip(offset);
    query.limit(pageSize);
    List<Sort.Order> orders = new ArrayList();
    orders.add(new Sort.Order(Sort.Direction.ASC, "_id"));
    Sort sort = Sort.by(orders);
    query.with(sort);
    mongoTemplate.find(query, entityClass, collectionName);

聚合操作

日常工作中需要从mongo数据库中提取下统计数据,在此记录下。方便查找。

脚本

db.collectionName.aggregate([
			{'$match':{'code':{$eq:'SD200501215739781110'}, "delFlag":1} }, 
			{'$group':{'_id':{ua:'$ua',ip:'$ip'},'count':{'$sum':NumberInt(1)} } },
			{$sort:{'count':-1}}
        ])

$project使用

// or 符合条件的使用
db.collectionName.aggregate([
	{'$match':{ "delFlag":1}},
	{
    "$match": {
        "$or": [{
            "openPageStatus": "vaild"
        }, {
            "openFrontPageStatus": "vaild"
        }]
    }
	},
	{
       	$project: {
          	   dateHour: { $dateToString: { format: "%Y-%m-%d %H", date: {$add: ["$createTime", 8 * 3600000]}} }
      	 }
    	 }, 
	{'$group':{_id:'$dateHour','count':{'$sum':NumberInt(1)} } },
        	{'$sort':{_id : 1} }
])

Java代码

      public List<HashMap> group(Map<String,Object> params, String[] groupKey,String[] queryKey,String collectionName,boolean uv) {
        // 聚合操作
        List<AggregationOperation> operations = new ArrayList<>();
        // 筛选条件
        Criteria criteria = new Criteria();
        Criteria[] criteriaArray = new Criteria[params.size() ];
        int j = 0;
        for (String key : params.keySet()) {
            if(params.get(key) instanceof ArrayList){
                criteriaArray[j] = Criteria.where(key).in((ArrayList)params.get(key));
            }else {
                criteriaArray[j] = Criteria.where(key).is(params.get(key));
            }
            j++;
        }
        criteriaArray[j] = Criteria.where("tinyUrl").ne(null);
        criteria.andOperator(criteriaArray);
        if(!params.isEmpty()){
            operations.add(Aggregation.match(criteria));
        }

        // 分组字段
        GroupOperation groupOperation = Aggregation.group(groupKey);
        // 聚合查询字段
        for (int i = 0; i < queryKey.length; i++) {
            groupOperation = groupOperation.count().as(queryKey[i]);
        }
        // 添加选项  (聚合查询字段和添加筛选是有区别的注意)
        operations.add(groupOperation);

        if(uv){
            GroupOperation groupOperation1 = Aggregation.group(groupKey);
            // 聚合查询字段
            for (int i = 0; i < queryKey.length; i++) {
                groupOperation1 = groupOperation1.count().as(queryKey[i]);
            }
            // 添加选项  (聚合查询字段和添加筛选是有区别的注意)
            operations.add(groupOperation1);
        }

        // 最终聚合查询所有信息
        Aggregation aggregation = Aggregation.newAggregation(operations).withOptions(Aggregation.newAggregationOptions().allowDiskUse(true).build());
        // 查询结果
        AggregationResults<HashMap> results = mongoTemplate.aggregate(aggregation, collectionName, HashMap.class);
        //获取结果
        List<HashMap> result = results.getMappedResults();
        return result;
    }

更新操作

db.collection.update(
   {},
   {$set:{updateFiled:updateValue}},
   {
     upsert: false,
     multi: true,
     writeConcern: {w:0|1|>1,j:false|true,wtimeout:10000}
   }
)
writeConcern:
w: 参数标识,1:默认,写入当前实例后返回 0:不返回任何响应 >1 :返回对应个数的实例响应
j: true: 写入journal 日志后响应
wtimeout: 操作超时时间

删除操作

db.collection.remove(
  	{queryFiled:queryValue},
   {
     justOne: true | false, # 是否只删除一个
     writeConcern: {w:0|1|>1,j:false|true,wtimeout:10000}
   }
)

查询并杀死mongo执行命令


# 查询执行超过3秒的命令
db.currentOp(
   {     "active" : true,     "secs_running" : { "$gt" : 3 }
   }
)
## 杀死mongo 进程
db.killOp(opid)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MongoDB提供了三种方式来执行聚合操作聚合管道方法、map-reduce方法和单一目标聚合方法。聚合管道方法可以理解为合计流水线法,通过对集合中的文档记录进行分类统计。该方法支持分片集合操作。使用聚合管道方法可以通过传递一系列的操作符来实现各种统计操作,比如求和($sum)、求平均值($avg)、取最小值($min)、取最大值($max)等等。聚合管道方法的语法如下: ``` db.collection_name.aggregate( [ {$match:{<field>}}, // 统计查找条件 {$group:{<field1>, <field2>}} // field1为分类字段;field2为含各种统计操作符的数值型字段,如$sum、$avg、$min、$max、$push、$addToSet、$first、$last操作符 ) ``` 聚合分类统计是聚合操作的一种,目前在MongoDB中有两种聚合操作功能:count()和distinct()。count()用于计算满足指定条件的文档数量,distinct()用于返回指定字段的唯一值列表。使用这两个方法可以对集合中的数据进行简单的聚合统计。 我希望这些信息对您有所帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [MongoDB——聚合操作详解](https://blog.csdn.net/cold___play/article/details/121447382)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值