最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java操作mongodb之多表聯(lián)查的實(shí)現(xiàn)($lookup)

 更新時(shí)間:2021年03月31日 10:45:47   作者:要么出眾,要么出局  
這篇文章主要介紹了java操作mongodb之多表聯(lián)查的實(shí)現(xiàn)($lookup),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

最近在開發(fā)的過程中,一個(gè)列表的查詢,涉及到了多表的關(guān)聯(lián)查詢,由于持久層使用的是mongodb,對(duì)這個(gè)非關(guān)系型數(shù)據(jù)使用的不是很多,所以在實(shí)現(xiàn)此功能的過程中出現(xiàn)了不少問題,現(xiàn)在此做記錄,一為加深自己的理解,以后遇到此類問題可以快速的解決,二為遇到同樣問題的小伙伴提供一點(diǎn)小小的幫助。

全文分為兩部分:

  1. 使用robo3t編寫多表關(guān)系的查詢語句
  2. 將編寫的查詢語句整合到j(luò)ava項(xiàng)目

多表聯(lián)查的查詢語句:

此處使用的為mongodb的robo3t可視化工具,先說下需求:從A(假如說是日志表)表中查詢出符合條件的數(shù)據(jù),根據(jù)A表中符合條件數(shù)據(jù)查詢B(假如說是信息表)表中的數(shù)據(jù),此處也可以將B表的查詢條件加入進(jìn)來(類型于關(guān)系型數(shù)據(jù)庫(kù)中的臨時(shí)表)

mongo查詢語句:

db.getCollection('A').aggregate([
    {
    $lookup:{
          from:'B',
          localField:'userid',
          foreignField:'userid',
          as:'userinfo'
        }
    }, 
    {
     $unwind:'$userrole'//把一個(gè)數(shù)組展成多個(gè),就比如說按多表連查的userrole數(shù)組中有10數(shù)據(jù),那么用$unwind將把一條帶數(shù)組的數(shù)據(jù)分成10條,這10條數(shù)據(jù)除了userrole不同之外,其它數(shù)據(jù)都是相同的,就類似于一個(gè)展開操作
    },
    {
     $match:{'username':'zhangsan'}
    },
    {
     $group:{
          _id:{
              userid:'$userid',//這個(gè)屬性必須是要A表中有的
              userrole:'$userrole.roleid',//A表中有一個(gè)集合,里面存放的對(duì)象有一個(gè)名為roleid的屬性
            },
          operateTime:{
              $last:'$operateTime'//取A表操作時(shí)間最后一條件數(shù)
            }
          info:{
              $first:'$userinfo'//因?yàn)閿?shù)組的擴(kuò)展,造成了大量的重復(fù)數(shù)據(jù)(只有userrole不同),$first是只取最新的一條
            }
        }
    },
    {
      $sort:{'operateTime':-1}//操作時(shí)間倒序,-1:倒序,1:升序
    },
    {
      $skip:0//跳過幾條數(shù)據(jù),也就是從第幾條數(shù)據(jù)開始取
    },
    {
      $limit:5//每頁(yè)顯示幾條數(shù)據(jù)
    }
]);

java代碼整合查詢語句

//定義分組字段
String[] groupIds = new String[] {"$userid","$userrole.roleid"};
//定義查詢條件
Criteria criteria = new Criteria();
//相當(dāng)于where username = "zhangsan"
criteria.and("username").is("zhangsan");
//相當(dāng)于 where age not in("15","20")
criteria.and("age").nin("15","20");
//in操作對(duì)應(yīng)的語句
//criteria.and("").in();
//定義排序條件
Sort sort = new Sort(Direction.DESC,"operateTime");
//聯(lián)合查詢總條數(shù),分頁(yè)用
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();
//組裝分頁(yè)對(duì)象
Page<BasicDBObject> pager = new Page<>(aggregate.getMappedResults(),count,pageSize,pageNumber,page*(pageNumber-1));
//對(duì)象轉(zhuǎn)換
將BasicDBObject轉(zhuǎn)換成前面需要的類型.....

到此這篇關(guān)于java操作mongodb之多表聯(lián)查的實(shí)現(xiàn)($lookup)的文章就介紹到這了,更多相關(guān)java mongodb多表聯(lián)查內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

绥德县| 望奎县| 河北省| 临洮县| 崇明县| 加查县| 晴隆县| 洛川县| 齐齐哈尔市| 广河县| 拜泉县| 彭泽县| 溧阳市| 池州市| 连山| 云和县| 高州市| 夹江县| 吴堡县| 深泽县| 衡东县| 皋兰县| 辉县市| 土默特左旗| 绍兴县| 房山区| 清远市| 道真| 湾仔区| 马尔康县| 仙居县| 临洮县| 大石桥市| 彭水| 依兰县| 乌鲁木齐县| 宁河县| 赤城县| 阜新市| 重庆市| 大荔县|