mongodb+java實現日誌的日活與月活查詢
業務介紹
前段時間有個日誌統計的需求,是規範的登陸日誌,估計一個月有幾十萬,放入hadoop太麻煩了,放資料庫又怕後續資料量增加較快,於是嘗試用mongodb來儲存,後續進行統計。
mongodb是採用3.4, 2017年12月最新的是3.6
先檢視下自己的系統,這裡是選擇用tar包來安裝
[[email protected]3 mongo]$ cat /proc/version
Linux version 2.6.32-504.el6.x86_64 ([email protected].bsys.dev.centos.org) (gcc version 4.4 .7 20120313 (Red Hat 4.4.7-11) (GCC) ) #1 SMP Wed Oct 15 04:27:16 UTC 2014
安裝配置mongo
這邊是把配置檔案放在 /etc/mongodb.conf
dbpath=/data/mongodb
logpath=/tmp/mongodb.log
#fork=true
logappend=true
bind_ip=0.0.0.0
port=5001
先不用auth啟動(不用auth,即能在本機有大許可權,這個過程中把使用者和資料庫給建立起來)
啟動:[路徑]/mongod -config /etc/mongodb.config無使用者登陸
[路徑]/mongo –port 5001新增管理使用者
(mongoDB 的使用者有點特別,是跟著db走的,即一個使用者是掛在哪個db下面的,如下面的語句是建一個admin使用者在admin庫下),admin庫則操作者各使用者
use admin
db.createUser({user: "admin", pwd: "abc123", roles: [{role:"userAdminAnyDatabase", db: "admin"}]})
- 在test資料庫中建立使用者
use test
db.createUser({user:'dgm',pwd:'dgm',roles:[{role:"readWrite" ,db:"test"}]})
- 關閉mongod程序(ctrl+c), 使用auth啟動
/路徑/mongod –auth -config /etc/mongodb.config
客戶端訪問
- 進行操作:
db.cuser.find()
db.cuser.find(
{
date:{$gt:'2017-05-15',$lt:'2017-05-17'}
}
)
// 日活
db.cuser.aggregate( [
{ $match: { date:{$gt:'2017-05-15',$lt:'2017-05-17'} } },
{
$group: {
_id: {
account: "$account"
}
}
},
{
$group: {
_id: null,
count: { $sum: 1 }
}
}
] )
// 每天的數量
db.cuser.aggregate( [
{
$group: {
_id: { $substrBytes: [ "$date", 0, 10 ] },
count: {$sum:1 }
}
}
])
整合java-spring
需要用到三個jar
mongo-java-driver-3.2.2.jar
spring-data-commons-1.11.4.RELEASE.jar
spring-data-mongodb-1.8.4.RELEASE.jar
這三個版本是匹配 spring 4.1.6左右的,如果spring 版本低會拋:
java.lang.NoSuchMethodError: org.springframework.core.annotation.AnnotatedElementUtils.findMergedAnnotation(Ljava/lang/reflect/AnnotatedElement;Ljava/lang/Class;)Ljava/lang/annotation/Annotation;
可以升spring版本,如果不想換spring版本,那就把上面三個jar包的版本降低,可以用maven倉庫jar一個個試.
- xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans";
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
xmlns:mongo="http://www.springframework.org/schema/data/mongo";
xsi:schemaLocation="http://www.springframework.org/schema/data/mongo
http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">;
<mongo:mongo-client id="mongo" host="xxxx"
port="5001" credentials="aaa:[email protected]" >
<mongo:client-options write-concern="SAFE" />
</mongo:mongo-client>
<mongo:db-factory id="mongoDbFactory"
dbname="test" mongo-ref="mongo" />
credentials是 “資料庫使用者名稱:資料庫使用者密碼@預設資料庫名”
- 設定一個對應表的javabean,JCActivityDevice.java
import org.springframework.data.mongodb.core.mapping.Document;
/**
* mongodb 啟用日誌collection
*
* @version 1.0
* @author
*/
@Document(collection="jc_activity_device_log")
public class JCActivityDevice implements Serializable {
private String date;
private String resultmessage;
private String usertoken;
private String userid;
private String mac;
private String Source;
private String result;
private String Model;
private String userIp;
private String serverIp;
private String sn;
private String account;
private String exetime;
- 呼叫mongodb方法:
@Resource(name="mongoTemplate")
private MongoTemplate mongoTemplate;
mongoTemplate.insert(entity);