MongoDB语法

MongoDB客户端:
1,NoSQL Manager for MongoDB
2,Robomongo(推荐,好多教程上的语句可以直接使用)
不同的客户端执行语句有差异

 参考:https://docs.mongodb.com/manual/reference/operator/aggregation/count/

一,NoSQL Manager for MongoDB客户端语句

1,id查询使用ObjectId

2,时间查询使用ISODate

{
  "_id" : ObjectId("5b498fb070bb993b335ab1c0"),
  "_class" : "com.onloon.custom.data.model.importdata.DetectiveTask",
  "keywords" : "pear",
  "status" : 0,
  "userId" : "645a828883714b679dc5d004e93dc192",
  "serverLevel" : "1",
  "createDate" : "20180714",
  "createTime" : ISODate("2018-07-14T05:52:48.584Z"),
  "updateTime" : ISODate("2018-07-14T05:52:48.584Z"),
  "countries" : "Russia&&United Kingdom"
}

 

{"userId":"645a828883714b679dc5d004e93dc192", "_id" : ObjectId("5b498fb070bb993b335ab1c0"),"createTime" : {$gte : ISODate("2018-07-14T05:52:48.584Z")}}

  

二,Robomongo客户端

1,SUM

按照productType统计pv的总和:

{
"_id" : ObjectId("598bb71370bb9933cf6fa196"),
"_class" : "com.onloon.website.analytics.core.entity.ProductTrafficBean",
"productId" : "83277ed6be2f4e46b6fbdc6866416e94",
"platform" : 0,
"shopId" : "151623511167744942",
"pv" : NumberLong(3),
"uv" : NumberLong(1),
"uvTime" : NumberLong(252186),
"msgProductCount" : 2,
"date" : "2017-08-10",
"productType" : "1",
"cookie" : ""
}


db.getCollection('doc_product_traffic').aggregate([{$group : {_id : "$productType", num_tutorial : {$sum : "$pv"}}}])

按照pageType统计总数:

{
"_id" : ObjectId("5a7d975c01c56936f40d1f27"),
"_class" : "com.onloon.website.analytics.core.entity.PageDirectBean",
"pageId" : "aa123a",
"pageType" : 2,
"redirectUrl" : "www.baidu.com"
}

db.getCollection('pageDirectBean').aggregate([{$group : {_id : "$pageType", num_tutorial : {$sum : 1}}}])

 2,COUNT

{“_ id”:ObjectId(“54936 ... dd0c”),“last_name”:“smith”,“first_name”:“mike”} 
{“_ id”:ObjectId(“54936 ... dd0d”),“last_name”:“smith “,”first_name“:”william“} 
{”_ id“:ObjectId(”54936 ... dd0e“),”last_name“:”smith“,”first_name“:”william“} 
{”_ id“:ObjectId(”54936 ... dd0f“),”last_name“:”smith“,”first_name“:”mark“}
> db.collection.find({“last_name”:“smith”}).count();> db.collection.distinct(“first_name”,{“last_name”:“smith”}).length;

 独立站点总IP数:

{
    "_id" : ObjectId("595dada070bb99301b45695a"),
    "_class" : "com.onloon.website.analytics.core.entity.PageViewLogBean",
    "domain" : "baidu.com",
    "url" : "dsds",
    "pageTitle" : "商品详情",
    "pageId" : "3232",
    "cookie" : "aba7981f-332a-421a-8a56-82095ddad5dd",
    "viewDate" : NumberLong(1499311520843),
    "viewFrom" : "0",
    "shopId" : "3232",
    "ip" : "223.93.170.250",
    "platform" : 0,
    "date" : "2017-07-06"
}

db.getCollection('doc_page_view_log').aggregate([{$match:{viewDate:{$lt:1532016000000}}},{$group: {_id: '$ip'} },{$count:"ipcount"}])

侦探次数:

{
    "_id" : ObjectId("5acf4e0170bb9918956ce28d"),
    "_class" : "com.onloon.custom.data.model.importdata.DetectiveTask",
    "keywords" : "phone",
    "status" : 0,
    "userId" : "83fcb7323c9a47de98403be7cedb9433",
    "serverLevel" : "1",
    "createDate" : "20180412",
    "createTime" : ISODate("2018-04-12T12:16:01.885Z"),
    "updateTime" : ISODate("2018-04-12T12:16:01.885Z")
}

db.getCollection('detectiveTask').count({"createTime" : {$lte : ISODate("2018-07-20T00:00:00.584Z")}})

 

 

分组查询公共方法:

/**
	 * 处理group时使用流式操作,务必注意顺序
	 * params 查询条件
	 * page  分页信息
	 * sortKey 排序值
	 * direction 升序还是降序
	 * filedsNameList 自定义返回的字段
	 * groupKey 需要去重的字段
	 */
	protected Aggregation getGeneralAggregation(Map<String, Object> params,
												Long pageNumber,
												Long pageSize,
												String sortKey,
												Sort.Direction direction,
												List<String> filedsNameList,
												String groupKey) {
		List<AggregationOperation> aggOptions = new ArrayList<>();
		{ // 添加查询条件
			List<Criteria> criteriaList = new ArrayList<>();
			if (params != null) {
				log.debug("查询参数:" + params);
				for (Map.Entry<String, Object> entry : params.entrySet()) {
					if (entry.getKey() != null && entry.getValue() != null) {
						switch (entry.getValue().getClass().getName()) {
							case "java.util.ArrayList":
							case "java.util.LinkedList":
								criteriaList.add(Criteria.where(entry.getKey()).in(entry.getValue()));
								break;
							default:
								criteriaList.add(Criteria.where(entry.getKey()).is(entry.getValue()));
								break;
						}
					}
				}
			}
			aggOptions.add(Aggregation.match(new Criteria().andOperator(criteriaList.toArray(new Criteria[criteriaList.size()]))));
		}
		{ // 分组
			if (!StringUtils.isEmpty(groupKey)) {
				aggOptions.add(new GroupOperation(Aggregation.fields(groupKey)).first("$$ROOT")
						.as("data"));
			}
		}
		{ // 排序
//			sortKey = "data." + (sortKey == null ? "id" : sortKey);
//			List<Sort.Order> orders = new ArrayList<Sort.Order>();
//			orders.add(new Sort.Order(direction, sortKey));
//			Sort sort = Sort.by(orders);
			Sort sort = new Sort(direction, "data."+sortKey);
			aggOptions.add(Aggregation.sort(sort));
		}
		{ // 分页
			if (pageNumber != null) {
				aggOptions.add(Aggregation.skip((int) (pageNumber > 0 ? (pageNumber - 1) * pageSize : 0)));
				aggOptions.add(Aggregation.limit(pageSize));
			}
		}
		{ // 添加返回field
			if (CollectionUtils.isNotEmpty(filedsNameList)) {
				filedsNameList = filedsNameList.stream()
						.map(str -> "data." + str)
						.collect(Collectors.toList());
				aggOptions.add(Aggregation.project(filedsNameList.toArray(new String[filedsNameList.size()])));
			}
		}
		Aggregation aggregation = Aggregation.newAggregation(aggOptions);
		return aggregation;
	}



Aggregation generalAggregation = getGeneralAggregation(params, Long.valueOf(page.toString()), Long.valueOf(size.toString()), "createTime", Sort.Direction.DESC, Arrays.asList("normalKeywords"), "normalKeywords");
		AggregationResults<String> searchTask = mongoTemplate.aggregate(generalAggregation, "searchTask", String.class);

  

按照日期分组查询:

按照用户分组:
db.getCollection('dnbSearchLog').aggregate([
	{ $match: { "createdTime" : {$gte : ISODate("2020-03-15 09:18:39.689Z")} } },
    { $group: { _id: "$userId", count: { $sum: 1 }} },
    { $sort: { "_id": -1 } }
])


按照日期分组:
db.getCollection('dnbSearchLog').aggregate([
    { $match: { "createdTime" : {$gte : ISODate("2020-03-15 09:18:39.689Z")} } },
    {
        $project: {
            quantity: 1, createdTime: { $dateToString: { format: "%Y-%m-%d", date: "$createdTime" } },
        }
    },
    { $group: { _id: "$createdTime", count: { $sum: 1 }} },
    { $sort: { "_id": -1 } }
])

 

分组求和之后再取最大值

db.getCollection('BaseSocialPageMonitor').aggregate([
        {
            "$match":{
                "platformType":1,
                "staticTime":{
                    $gte:ISODate("2018-07-14T05:52:48.584Z"),
                    $lt:ISODate("2020-07-20T05:52:48.584Z")
                },
                "postTotal":{$gte:1}
            }
        },
        {
            "$group":{
                "_id":"$platformAccountId",
                "sumPost":{"$sum":"$postTotal"}
            }
        },
        {
             "$sort":{
                 sumPost:-1    
             }    
        },
        {$limit:1}
    ])

  

 

两次分组:按照国家统计UV

先根据国家分组,然后查出每个国家下有多少个去重后的cookie

参考:https://www.coder.work/article/35662

db.getCollection('doc_page_view_log')
.aggregate([
{ $match: { "viewDate":{$gte:1623733217000}, "shopId":"302545389934906860"} },
{ $group: { _id: { countryName: "$countryName", cookie: "$cookie" } }},
{ $group: { _id: { countryName: "$_id.countryName" }, count: { $sum: 1 }} },
{ $sort: { "_id": -1 } }
])

  

 

 

每个页面的平均浏览页面:pv/uv 

db.getCollection("doc_page_view_event").aggregate([
        {
            "$match":
            {
                "shopId": "648107773959134989",
                "platform": 0,
                "date":
                {
                    "$gte": "2022-01-01",
                    "$lte": "2022-10-01"
                },
                "event": "pageView"
            }
        },
        {
            "$group":
            {
                "_id": "$url",
                "sumPv":
                {
                    "$sum": 1
                },
                "cookieList":
                {
                    "$addToSet": "$cookie"
                }
            }
        },
//        { $project: { sumPv: 1 , cookieList:1, "cnt":{"$size":"$cookieList"}}},
//        { $project: { sumPv: 1 , sumUv:{"$size":"$cookieList"}, avgPage:{$divide:["$sumPv", {"$size":"$cookieList"}]}}},
          { $project: { avgPage:{$divide:["$sumPv", {"$size":"$cookieList"}]}}},


        {
            "$sort":
            {
                "avgPage": 1
            }
        },
        {
            "$skip": 0
        },
        {
            "$limit": 10
        }

])

 

 

 

 

 

 分组后的总数:

db.getCollection('googleSearchTask').distinct("mainUserId",{"createTime" : {$gte:ISODate("2021-12-29 18:04:59.000Z")}})

 

 

 先分组然后根据count倒序

db.getCollection('doc_product_traffic').aggregate([
    {
            "$match":{
                "productType":3 
            }
    },
    { $group: { _id: "$productId", coun: { $sum: 1 }} },
    {$sort:{coun:-1}}


])
posted @ 2018-07-14 15:33  wanhua.wu  阅读(249)  评论(0编辑  收藏  举报