mongodb-多表聯(lián)查與后續(xù)的數(shù)據(jù)處理

mongodb:3.6

數(shù)據(jù)

1,user表

{
    "_id" : ObjectId("5b69062240a6d80a6cece003"),
    "name" : "小明",
    "age" : 28,
    "createtime" : ISODate("2018-08-07T02:38:26.601Z"),
    "_class" : "com.xiangpeng.bo.UserBo"
}

2膀懈,orders表

/* 1 */
{
    "_id" : ObjectId("5b69062240a6d80a6cece004"),
    "uid" : ObjectId("5b69062240a6d80a6cece003"),
    "money" : 10.0,
    "createtime" : ISODate("2018-08-07T02:38:26.601Z"),
    "produce" : "產(chǎn)品1",
    "_class" : "com.xiangpeng.bo.OrderBo"
}

/* 2 */
{
    "_id" : ObjectId("5b6a5711c2eee4295c63768e"),
    "uid" : ObjectId("5b69062240a6d80a6cece003"),
    "money" : 20.0,
    "produce" : "產(chǎn)品2",
    "createtime" : ISODate("2018-08-07T02:38:26.601Z"),
    "_class" : "com.xiangpeng.bo.OrderBo"
}

查詢

1,mongodb的多表查詢比較簡單,使用$lookup關(guān)鍵字即可:

db.user.aggregate([{$lookup:{from:"orders",localField:"_id",foreignField:"uid",as:"orders"}}])

結(jié)果:

{
    "_id" : ObjectId("5b69062240a6d80a6cece003"),
    "name" : "小明",
    "age" : 28,
    "createtime" : ISODate("2018-08-07T02:38:26.601Z"),
    "_class" : "com.xiangpeng.bo.UserBo",
    "orders" : [ 
        {
            "_id" : ObjectId("5b69062240a6d80a6cece004"),
            "uid" : ObjectId("5b69062240a6d80a6cece003"),
            "money" : 10.0,
            "createtime" : ISODate("2018-08-07T02:38:26.601Z"),
            "produce" : "產(chǎn)品1",
            "_class" : "com.xiangpeng.bo.OrderBo"
        }, 
        {
            "_id" : ObjectId("5b6a5711c2eee4295c63768e"),
            "uid" : ObjectId("5b69062240a6d80a6cece003"),
            "money" : 20.0,
            "produce" : "產(chǎn)品2",
            "createtime" : ISODate("2018-08-07T02:38:26.601Z"),
            "_class" : "com.xiangpeng.bo.OrderBo"
        }
    ]
}

參數(shù)解釋:
form:需要關(guān)聯(lián)的外表名,lookup的多變查詢使用的是左外連接 localField:本表的外表關(guān)聯(lián)字段; foreignField:外表的關(guān)聯(lián)字段; as:參考查詢結(jié)果,使用lookup進行查詢后會將所有符合條件的文檔封裝為一個list,as參數(shù)定義這個list的名字;

數(shù)據(jù)處理

使用$unwind將數(shù)據(jù)打散:

db.user.aggregate([
        {$lookup:{from:"orders",localField:"_id",foreignField:"uid",as:"orders"},
        {$unwind:"$orders"}
])

$unwind的作用是將文檔中的數(shù)組拆分為多條,拆分結(jié)果為:

/* 1 */
{
    "_id" : ObjectId("5b69062240a6d80a6cece003"),
    "name" : "小明",
    "age" : 28,
    "createtime" : ISODate("2018-08-07T02:38:26.601Z"),
    "_class" : "com.xiangpeng.bo.UserBo",
    "orders" : {
        "_id" : ObjectId("5b69062240a6d80a6cece004"),
        "uid" : ObjectId("5b69062240a6d80a6cece003"),
        "money" : 10.0,
        "createtime" : ISODate("2018-08-07T02:38:26.601Z"),
        "produce" : "產(chǎn)品1",
        "_class" : "com.xiangpeng.bo.OrderBo"
    }
}

/* 2 */
{
    "_id" : ObjectId("5b69062240a6d80a6cece003"),
    "name" : "小明",
    "age" : 28,
    "createtime" : ISODate("2018-08-07T02:38:26.601Z"),
    "_class" : "com.xiangpeng.bo.UserBo",
    "orders" : {
        "_id" : ObjectId("5b6a5711c2eee4295c63768e"),
        "uid" : ObjectId("5b69062240a6d80a6cece003"),
        "money" : 20.0,
        "produce" : "產(chǎn)品2",
        "createtime" : ISODate("2018-08-07T02:38:26.601Z"),
        "_class" : "com.xiangpeng.bo.OrderBo"
    }
}

數(shù)據(jù)過濾

現(xiàn)在可以對數(shù)據(jù)進行過濾,數(shù)據(jù)過濾的步驟應(yīng)該盡可能提前,但如果過濾條件中也需要篩選外表條件的話就沒辦法放前面了,過濾在聚合中使用$match

db.user.aggregate([
    {$lookup:{from:"orders",localField:"_id",foreignField:"uid",as:"orders"}},
    {$unwind:"$orders"},
    {$match:{name:"小明","orders.produce":"產(chǎn)品2"}}
])

查出小明買的產(chǎn)品2訂單
結(jié)果展示

/* 1 */
{
    "_id" : ObjectId("5b69062240a6d80a6cece003"),
    "name" : "小明",
    "age" : 28,
    "createtime" : ISODate("2018-08-07T02:38:26.601Z"),
    "_class" : "com.xiangpeng.bo.UserBo",
    "orders" : {
        "_id" : ObjectId("5b6a5711c2eee4295c63768e"),
        "uid" : ObjectId("5b69062240a6d80a6cece003"),
        "money" : 20.0,
        "produce" : "產(chǎn)品2",
        "createtime" : ISODate("2018-08-07T02:38:26.601Z"),
        "_class" : "com.xiangpeng.bo.OrderBo"
    }
}

如果對字段結(jié)果有要求可以使用$project進行字段篩選:

db.user.aggregate([
    {$lookup:{from:"orders",localField:"_id",foreignField:"uid",as:"orders"}},
    {$unwind:"$orders"},
    {$match:{name:"小明","orders.produce":"產(chǎn)品2"}},
    {$project:{name:"$name",age:"$age",produce:"$orders.produce",money:"$orders.money"}}])

再聚合中$可以用作引用相應(yīng)字段的值
結(jié)果為:

/* 1 */
{
    "_id" : ObjectId("5b69062240a6d80a6cece003"),
    "name" : "小明",
    "age" : 28,
    "produce" : "產(chǎn)品2",
    "money" : 20.0
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末顿锰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吏砂,更是在濱河造成了極大的恐慌撵儿,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狐血,死亡現(xiàn)場離奇詭異淀歇,居然都是意外死亡,警方通過查閱死者的電腦和手機匈织,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門浪默,熙熙樓的掌柜王于貴愁眉苦臉地迎上來牡直,“玉大人,你說我怎么就攤上這事纳决∨鲆荩” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵阔加,是天一觀的道長饵史。 經(jīng)常有香客問我,道長胜榔,這世上最難降的妖魔是什么胳喷? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮夭织,結(jié)果婚禮上吭露,老公的妹妹穿的比我還像新娘。我一直安慰自己尊惰,他們只是感情好讲竿,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著弄屡,像睡著了一般题禀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上膀捷,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天投剥,我揣著相機與錄音,去河邊找鬼担孔。 笑死,一個胖子當(dāng)著我的面吹牛吃警,可吹牛的內(nèi)容都是我干的糕篇。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼酌心,長吁一口氣:“原來是場噩夢啊……” “哼拌消!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起安券,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤墩崩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后侯勉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鹦筹,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年址貌,在試婚紗的時候發(fā)現(xiàn)自己被綠了铐拐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片徘键。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖遍蟋,靈堂內(nèi)的尸體忽然破棺而出吹害,到底是詐尸還是另有隱情,我是刑警寧澤虚青,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布它呀,位于F島的核電站,受9級特大地震影響棒厘,放射性物質(zhì)發(fā)生泄漏纵穿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一绊谭、第九天 我趴在偏房一處隱蔽的房頂上張望政恍。 院中可真熱鬧,春花似錦达传、人聲如沸篙耗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宗弯。三九已至,卻和暖如春搂妻,著一層夾襖步出監(jiān)牢的瞬間蒙保,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工欲主, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留邓厕,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓扁瓢,卻偏偏與公主長得像详恼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子引几,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 簡介 MongoDB 是一個基于分布式文件存儲的NoSQL數(shù)據(jù)庫 由C++語言編寫昧互,運行穩(wěn)定,性能高 旨在為 WE...
    大熊_7d48閱讀 36,039評論 1 9
  • 1伟桅、聚合查詢 聚合查詢主要使用聚合框架對集合中的文檔進行變換與組合敞掘,以實現(xiàn)對文檔的一連串處理。這些處理包含篩選(F...
    橋頭放牛娃閱讀 1,346評論 1 43
  • 什么是Mongodb數(shù)據(jù)庫楣铁? MongoDB 是由C++語言編寫的玖雁,是一個基于分布式文件存儲的開源數(shù)據(jù)庫系統(tǒng) Mo...
    瘦不下去了閱讀 667評論 0 0
  • 1. MongoDB 簡介 MongoDB是一個可擴展的高性能,開源民褂,模式自由茄菊,面向文檔的NoSQL疯潭,基于分布式文...
    rhlp閱讀 1,101評論 0 3
  • 簡介 NoSQL : 全名為Not Only SQL, 指的是非關(guān)系型的數(shù)據(jù)庫 隨著訪問量上升, 網(wǎng)站的數(shù)據(jù)庫性能...
    奮斗的老王閱讀 3,028評論 4 47