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)