A. java mongoDB怎麼返回數組欄位數組的指定索引的元素
mongodb中使用aggregate可以返回數組欄位數組的指定索引的元素
參考語者宏句:
{$match:{'id':15}},
{$project:{id:1,"default":1}},
{$unwind:"$default.styles"},
{$match:{'default.styles.status':1}},
{$group:{_id:"$_id","defaults":{$push:"$default.styles"}}}
解核嫌游釋:
1:改銷過濾數據{$match:{'id':15}}
2:獲取想要的列{$project:{id:1,"default":1}}
3:獲取展開後數組欄位{$unwind:"$default.styles"}
4:條件查詢數組元素{$match:{'default.styles.status':1}}
5:分組後保存結果{$group:{_id:"$_id","defaults":{$push:"$default.styles"}}}
B. Mongodb Aggregation group()分組操作
Mongo的分組操作有兩種方式: aggregate({$group:{}}) 和 group()
{ $group: { _id: <expression>, <field1>: { <accumulator1> : <expression1> }, ... } }
為必選欄位,為被分組欄位,可為空或null
為可選欄位,其中可包含一下運算符:
1.僅分組,對issue_xjtf表中sp1,sp2進行分組
相當於sql
db.collection.group({ key, rece, initial [, keyf] [, cond] [, finalize] })
前三個是必備參數,「[]」中是可選參數
可以放用來分組的欄位,並且會返回其中欄位(group by 後面的欄位)
是在分組操作期間對文檔進行操作的聚合函數。可以返回總和或計數。該函數有兩個參和態數:當前文檔;該組的聚合結果文檔。
對喚讓源結果中文檔,欄位進行初始化
對數據篩選的條件,相當於where
1. count :取xbgi表中,article_pubdate值大於2000-01-01的數據,並分組計數
2. max :取sjwd表中,ric_publication_coden為9529a8f7-3eef-431a-a0cd-e49d601417df,用article_year分組計數,滑毀取其最晚日期。
3. sum :在表total_journal_issue中以journal_id分組,並獲取article_count總數
用Navicat 執行group()時,分組值超過20000,會報如下錯誤(未檢測具體原因):
C. MongoDB Aggregate $project中,如果想新加一列常數,如何寫
不知道報的什麼錯,我沒用過C#的driver,但是我感覺C#的人不像javascript的人那樣愛用不確定數量的參數,所以我想C#的Aggregate方法接受的參數應該是數組、IList或者IEnumerable之類的東西吧,你試試:
AggregateResultresult=books.Aggregate(new[]{query});
之類的看看行不行。
D. java mongo連接問題,一直超時,原因不知道在哪
在對超過百萬條記錄的集合進行聚合操作。御扒
DBObject match=(DBObject)JSON.parse("{$match:{logType:{'$in':[5,9]}}}"); DBObject group=(DBObject)JSON.parse("{$group:{'_id':'$domainUrl','count':{'$sum':1}}}"); AggregationOutput output = logCollection.aggregate(match,group);
偶爾會發生Read timed out 異常。
com.mongodb.MongoException$Network: Read operation to server /192.168.10.202:27017 failed on database adLogTable at com.mongodb.DBTCPConnector.innerCall(DBTCPConnector.java:253) at com.mongodb.DB.command(DB.java:261) at com.mongodb.DB.command(DB.java:243) ... Caused by: java.net.SocketTimeoutException: Read timed out at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:152)
通過多次測試,發現執行一次聚合平均時間為5s,超過5s時就會報錯!
然後查看MongoDB的配置信息:
socket-timeout="5000" //5s
socket-timeout的默認配置為0,也就是沒有限制。
沒有超時限制,系統出了問題也不容易發現,應該根派首據實際情況,給出合理鎮羨昌的超時時間。
通過多次測試發現最長執行時間為6秒,就把超時時間設置成了10000。
E. Java對mongodb進行正則查詢
用Java實現MongoDB正則查詢小技巧:
//模糊查詢
private BasicDBObject getLikeStr(String findStr) {
Pattern pattern = Pattern.compile("^.*" + findStr + ".*$", Pattern.CASE_INSENSITIVE);
return new BasicDBObject("$regex", pattern);
}
DBObject query = new BasicDBObject();
query.put("real_name", getLikeStr(userName));
//endWith文件擴展名
private BasicDBObject endWithStr(String findStr) {
Pattern pattern = Pattern.compile(findStr + "$", Pattern.MULTILINE);
return new BasicDBObject("$regex", pattern);
}
DBObject query = new BasicDBObject();
query.put("filename", endWithStr(「.pdf」));
F. SpringBoot整合MongoDB實戰
MongoTemplate配置
一般情況下,按照如下配置,springboot會進行自動裝配,但是如果需要實現一些自定義的功能,例如密碼加解密,類型轉換等功能需要手寫配置MongoTemplate。
@EnableMongoRepositories()表示支持Spring JPA,即通過規范命名的介面來實現簡單的DB操作,不需要自己寫Query,可以通過該註解的value屬性來指定註解的作用范圍。
ReUtil是一個正則表達式的工具類,用於判斷配置文件的格式是否正確,配置MongoDatabaseFactory過程中實現一個比較簡單的配置文件解密的過程,解密方法用簡單的字元串翻轉來實現。
通過MappingMongoConverter來實現java中的對象與MongoDB中的Document進行一些復雜的映射,默認情況下一個java域對象存入MongoDB時會生成一個"_class"的key對應存儲Java對象類型,通過
來取消每條記錄生成一個"-class"的數據。
通過MappingMongoConverter實現一個簡單的時間轉化功能TimestampConverter,如下所示
還可以進行更加精細化的配置,例如
可以通過WritingConverter和ReadingConverter配置Document和Java對象相互轉化。
MongoTemplate實戰
例如一個博客系統,我們通過MongoDB存儲用戶的瀏覽記錄,瀏覽記錄的實體如下所示,
如上所示,每個人對應每篇文章有一條瀏覽記錄,每次訪問都會對訪問次數viewCount進行+1操作.下文針對這個場景介紹MongoTemplate的基本操作。
這些操作用法基本一樣,如下所示,傳入一個封裝查詢條件的對象Query,Java中映射的對象entityClass和MongoDB中對應的Document的名稱。
例如我們想要查詢某個用戶某篇博客的訪問次數,我們只需要通過博客id和訪問者構建查詢條件進行查詢即可。
findAndModify表示更新符合查詢條件的記錄,其方法如下所示,
Query封裝查詢條件,Update封裝的是更新內容。例如用戶每次刷新頁面瀏覽次數會+1操作,我們可以使用findAndModify操作,如下所示
如上所示,首先判斷用戶是否存在訪問記錄,如果存在則通過Update對訪問次數viewCount進行+1操作,若不存在訪問記錄則新建訪問記錄。
保存操作包括主要包括insert和save方法,這兩個方法都沒有返回值,同時兩個方法有一些區別,
該方法如下所示,
注釋說明該方法的功能是,如果存在與查詢條件匹配的文檔,則根據Update中的內容進行更新,如果不存在符合查詢條件的內容,則根據查詢條件和Update插入新的文檔。
聚合查詢 MongoDB 中聚合(aggregate)主要用於處理數據(諸如統計平均值,求和等),並返回計算後的數據結果。本文側重於Java實現。
結合上述中的訪問記錄的場景,如果我們需要統計某個博主某個專欄下面所有文章的訪問記錄,包括訪問總人數,訪問總次數,以及每個訪客對應的訪問次數詳情,並且要滿足分頁需求,那麼我們需要用到MongoDB的聚合操作,具體實現如下所示
總結
本文詳細介紹了SpringBoot如何整合MongoDB,並且結合博客系統的訪問記錄展示了MongoTemplate的基本用法。
G. java mongodb多條件分組
//首先利$match篩選出where條件此處看你的查詢范圍條件了
BasicDBObject[]array={newBasicDBObject("startTimeLong",newBasicDBObject("$gte",beginTime)),
newBasicDBObject("startTimeLong",newBasicDBObject("$lt",endTime))};
BasicDBObjectcond=newBasicDBObject();
cond.put("$and",array);
DBObjectmatch=newBasicDBObject("$match",cond);
//利用$project拼裝group需要的數據,包含name列、age列
DBObjectfields=newBasicDBObject("name",1);
fields.put("age",1);
DBObjectproject=newBasicDBObject("$project",fields);
//利用$group進行分組
DBObject_group=newBasicDBObject("name","$name");
_group.put("age","$age");
DBObjectgroupFields=newBasicDBObject("_id",_group);
//總數
groupFields.put("count",newBasicDBObject("$sum",1));
DBObjectgroup=newBasicDBObject("$group",groupFields);
AggregationOutputoutput=MongodbUtil.getLogInfoCollection().aggregate(match,project,group);