您好,登錄后才能下訂單哦!
這期內(nèi)容當中小編將會給大家?guī)碛嘘P怎么在java中使用mongodb實現(xiàn)多表聯(lián)查,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
多表聯(lián)查的查詢語句:
此處使用的為mongodb的robo3t可視化工具,先說下需求:從A(假如說是日志表)表中查詢出符合條件的數(shù)據(jù),根據(jù)A表中符合條件數(shù)據(jù)查詢B(假如說是信息表)表中的數(shù)據(jù),此處也可以將B表的查詢條件加入進來(類型于關系型數(shù)據(jù)庫中的臨時表)
mongo查詢語句:
db.getCollection('A').aggregate([ { $lookup:{ from:'B', localField:'userid', foreignField:'userid', as:'userinfo' } }, { $unwind:'$userrole'//把一個數(shù)組展成多個,就比如說按多表連查的userrole數(shù)組中有10數(shù)據(jù),那么用$unwind將把一條帶數(shù)組的數(shù)據(jù)分成10條,這10條數(shù)據(jù)除了userrole不同之外,其它數(shù)據(jù)都是相同的,就類似于一個展開操作 }, { $match:{'username':'zhangsan'} }, { $group:{ _id:{ userid:'$userid',//這個屬性必須是要A表中有的 userrole:'$userrole.roleid',//A表中有一個集合,里面存放的對象有一個名為roleid的屬性 }, operateTime:{ $last:'$operateTime'//取A表操作時間最后一條件數(shù) } info:{ $first:'$userinfo'//因為數(shù)組的擴展,造成了大量的重復數(shù)據(jù)(只有userrole不同),$first是只取最新的一條 } } }, { $sort:{'operateTime':-1}//操作時間倒序,-1:倒序,1:升序 }, { $skip:0//跳過幾條數(shù)據(jù),也就是從第幾條數(shù)據(jù)開始取 }, { $limit:5//每頁顯示幾條數(shù)據(jù) } ]);
java代碼整合查詢語句
//定義分組字段 String[] groupIds = new String[] {"$userid","$userrole.roleid"}; //定義查詢條件 Criteria criteria = new Criteria(); //相當于where username = "zhangsan" criteria.and("username").is("zhangsan"); //相當于 where age not in("15","20") criteria.and("age").nin("15","20"); //in操作對應的語句 //criteria.and("").in(); //定義排序條件 Sort sort = new Sort(Direction.DESC,"operateTime"); //聯(lián)合查詢總條數(shù),分頁用 Aggregation aggregationCount = Aggregation.newAggregation( Aggregation.match(criteria);//查詢條件 Aggregation.group(groupIds);//分組字段 ); //聯(lián)合查詢條件 Aggregation newAggregation = Aggregation.newAggregation( Aggregation.lookup('B','userid','userid','userinfo'),//從表名,主表聯(lián)接字段,從表聯(lián)接字段,別名 Aggregation.unwind("$userrole"), Aggregation.match(criteria), Aggregation.group(groupIds) .last("$operateTime").as("operateTime")//取值,起別名 .first("$userinfo").as("info"), Aggregation.sort(sort), Aggregation.skip(pageSize*(pageNumber-1L)),//Long類型的參數(shù) Aggregation.limit(pageSize) ); //查詢 AggregationResults<BasicDBObject> aggregate = mongoTemplate.aggregate( newAggregation ,"A",BasicDBObject.class//A表,是查詢的主表 ); int count = mongoTemplate.aggregate(aggregationCount ,"A",BasicDBObject.class).getMappedResults().size(); //組裝分頁對象 Page<BasicDBObject> pager = new Page<>(aggregate.getMappedResults(),count,pageSize,pageNumber,page*(pageNumber-1)); //對象轉(zhuǎn)換 將BasicDBObject轉(zhuǎn)換成前面需要的類型.....
上述就是小編為大家分享的怎么在java中使用mongodb實現(xiàn)多表聯(lián)查了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。