您的位置:首页 > 数据库 > Mongodb

MongoDB 常用语句

2016-11-30 11:09 176 查看
记录一下自己用到的MongoDB的语句,说实话,这东西时间一久,不常用的话,就都忘记了.


1 存在就更新,不存在就插入 $setOnInsert (根据id和日期更新数据,如果存在则更新,不存在符合条件的插入)

db.dayCollect.update({"advId":"333333333","date":"2016-11-29"},{$setOnInsert: {"name":"mingzi","shopName":"mingzi","areaName":"mingzi","itemName":"mingzi","deviceNum":0,},$inc: {playTimes:3}},{upsert:true})

换成Template写法为:

Query query = Query.query(where("advId").is("333333333").and("date").is("2016-11-29"));
mongoTemplate.upsert(query, new Update().inc("playTimes", 2).set("name", "mingzi").set("shopName", "mingzi").set("areaName", "mingzi").set("itemName", "mingzi").set("deviceNum", 0), "dayCollect");




2 mongoTemplate 查询统计符合时间范围内的数据,并去重某个字段后的数量.

 

Query query =Query.query(Criteria.where("advId").is("1").andOperator(Criteria.where("playTime").gte(todayFormat).lt(tomorrowFormat)));
long count = mongoTemplate.getCollection(advPlay_COLLECTION).distinct("deviceCode",  query.getQueryObject()).size();


3 mongo aggregate 聚合管道分组查询:根据advId广告id分组查询, 查询符合时间范围内的,广告id=[固定值]的,带分页的查询.

mongo 原生语句:

db.dayCollect.aggregate([

    {

        $match: {date:{$gt:"2016-12-04",$lte: "2016-12-11"}}

    }, 

    {

        $match: {advId:{$in:["2","36"]}}

    }

    , {$group : {_id : "$advId", playTimes : {$sum : "$playTimes"}}}

    ,{$sort:{_id:1}}

    ,{$skip:0},

    {$limit:10}

 ]);

mongoTemplate java查询

AggregationOutput aggregationOutput=null;
//根据具体时间获取一周的时间段,具体到天
String[] timeInterval = getTimeInterval(date);

DBObject datematch = (DBObject) JSON.parse("{$match: {date:{$gt:\""+timeInterval[0]+"\",$lte: \""+timeInterval[1]+"\"}}}");
       
    DBObject group = (DBObject) JSON.parse("{$group : {_id : \"$advId\", playTimes : {$sum : \"$playTimes\"}}}");
    
    DBObject sort = (DBObject) JSON.parse("{$sort:{_id:-1}");
    
    DBObject skip = (DBObject) JSON.parse("{$skip:"+pageView.getStartPage()+"}");
    
    DBObject limit = (DBObject) JSON.parse("{$limit:"+pageView.getPageSize()+"}");

if(!StringUtils.isEmpty(advIds)){
String[] split = advIds.split(",");
DBObject advIdmatch = (DBObject) JSON.parse("{$match: {advId:{$in:["+split+"]}}}");
aggregationOutput = mongoTemplate.getCollection(DAY_COLLECT).aggregate(datematch, advIdmatch,group,sort,skip,limit);
}else{
aggregationOutput = mongoTemplate.getCollection(DAY_COLLECT).aggregate(datematch, group,sort,skip,limit);
}

Iterable<DBObject> output = aggregationOutput.results();

List<WeekConllect> weekList = new ArrayList<WeekConllect>();

         for (DBObject obj : output) {

             BasicDBObject obj2 = (BasicDBObject) obj;

             WeekConllect conllect =new WeekConllect();

             conllect.setAdvId(obj2.getString("_id"));

             conllect.setPlayTimes(obj2.getString("playTimes"));

             weekList.add(conllect);

         }

4 按照一天的 24小时分组统计某些数据,因为我的时间是用字符串存储的,所以只能用截取这么玩了

db.advPlaysDetails.aggregate([
{
$match: {advId:"1"}
},
{
$match: {playTime:{$gt: "2016-11-29",$lt:"2016-11-31"  }}
},
{
$project :{new_time_stamp :{$substr :["$playTime",11,2]},"_id":0,playTimes:1,}

},
{
$group : {_id :"$new_time_stamp", playTimes : {$sum : "$playTimes"}}

}

])

无痛破处
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: