初入MongoDB

初入MongoDB

業(yè)務(wù)需求,需要用到MongoDB雄妥。向來一直是mysql數(shù)據(jù)庫的思想最蕾,一下轉(zhuǎn)換為nosql還是很不適應(yīng)。經(jīng)過一個(gè)月的開發(fā)老厌,寫一下自己的感觸瘟则。本文會(huì)對(duì)應(yīng)mysql數(shù)據(jù)庫進(jìn)行說明。

數(shù)據(jù)庫類型

文檔型數(shù)據(jù)庫:存儲(chǔ)的數(shù)據(jù)是非結(jié)構(gòu)化數(shù)據(jù)枝秤。文檔存儲(chǔ)一般用類似 json 的格式存儲(chǔ)醋拧,存儲(chǔ)的內(nèi)容是文檔型的。

相比mysql來說,mysql的表是高度結(jié)構(gòu)化的丹壕,若添加字段可能需要修改表結(jié)構(gòu)庆械。MongoDB的話沒有這個(gè)煩惱,在其中的每條數(shù)據(jù)可以認(rèn)為一個(gè)“文檔”雀费。比如干奢,一篇文章+評(píng)論,它可以存儲(chǔ)為一個(gè)json盏袄,囊括了所有的信息忿峻,直接存入數(shù)據(jù)庫。并且可以動(dòng)態(tài)的橫向擴(kuò)展辕羽,不用擔(dān)心字段不存在的問題逛尚。

結(jié)構(gòu)對(duì)比

關(guān)系型數(shù)據(jù)庫術(shù)語/概念 MongoDB 術(shù)語/概念 解釋/說明
Database Database 數(shù)據(jù)庫
Table Collection 數(shù)據(jù)庫表/集合
Row Document 數(shù)據(jù)記錄行/文檔
Column Field 數(shù)據(jù)列/數(shù)據(jù)字段
Index Index 索引
Table joins 表關(guān)聯(lián)/MongoDB 不支持(可以使用聚合查詢)
Primary Key Object ID 主鍵/MongoDB 自動(dòng)將_id 設(shè)置為 主鍵

接下來介紹一下項(xiàng)目中遇到的查詢,以nodejs為例

使用 & 高級(jí)查詢

基本查詢

//分頁排序參數(shù)
let opt = {
    sort: {username: 1},
    skip: (value.pageNum - 1) * value.pageSize,
    limit: value.pageSize,
}
//條件
let query = {status: {$ne: -1}}
if (params.keyWords) {
    //正則表達(dá)式
    let reg = new RegExp(value.keyWords)
    query['$or'] = [
        {nickname: reg},
        {phone: reg},
    ]
}
let admins = await AdminModel.getByQuery(query, '', opt)
let admin = await AdminModel.getOneByQuery(query)

查詢方法

//查詢多條
getByQuery(query, fileds, opt) {
    return this.model.find(query, fileds, opt).exec();
}
//查詢單條
getOneByQuery(query, fileds, opt) {
    return this.model.findOne(query, fileds, opt).exec();
}
//數(shù)量查詢
countByQuery(query) {
    return this.model.countDocuments(query)
}
//更新
update(conditions, update, options) {
    return this.model.updateMany(conditions, update, options);
}
//去重查詢
distinct(query, field) {
    return this.model.find(query).distinct(field);
}
//保存
save(model) {
    model = model instanceof this.model ? model : new this.model(model);
    return model.save();
}
//更新
update(conditions, update, options) {
    return this.model.updateMany(conditions, update, options);
}

關(guān)聯(lián)查詢

有時(shí)候由于業(yè)務(wù)的需要刁愿,需要關(guān)聯(lián)查詢绰寞。例如,查詢某部門的信息铣口,需要帶有相應(yīng)的負(fù)責(zé)人滤钱。

這里呢,需要在dept(部門表)中添加相應(yīng)用戶表(user)表的objectId脑题,就是MongoDB生成的_id

const Schema = Model.SchemaExt({
    // userId為字段名稱件缸,ref中的“user” 代辦表名
    userId: {type: ObjectId, ref: "user"},     // 負(fù)責(zé)人
    code: {type: String, required: true, unique: true},  // 部門編號(hào)
    name: {type: String, required: true},                // 部門名稱
    //...
})

這樣的話,我們可以使用聚合查詢查詢出相關(guān)數(shù)據(jù)

//這里的populate叔遂,代表的是字段名稱
getByIdPopulate(id, populate) {
    return this.model.findOne({_id: id}).populate(populate).exec();
}

查詢結(jié)果

{
    code: 001
    name: 山東分部
    userId: {
        _id: xxxxx,
        username: xx他炊,
        phone: xxx
    }
}

聚合查詢

這樣引申出另外一個(gè)問題,如果我需要根據(jù)手機(jī)號(hào)查找部門呢

let listedModel = await deptModel.aggregate([
    //關(guān)聯(lián)表已艰,form需要關(guān)聯(lián)的表痊末,localField自己的字段,foreignField關(guān)聯(lián)到表的字段凿叠,as關(guān)聯(lián)出的內(nèi)容key
    {
        $lookup: {
            from: "admins",
            localField: "admin",
            foreignField: "_id",
            as: "adminDetail"
        }
    }, {
        $unwind: '$adminDetail'
    }, {
        //查詢條件,這里query = {'adminDetail.phone': xxx}
        $match: query,
    }, {
        //分頁
        $facet: {
            data: [{
                $sort: opt.sort
            }, {
                $skip: opt.skip
            }, {
                $limit: opt.limit
            }],
            count: [{
                $group: {
                    _id: "count",
                    total: {$sum: 1}
                },
            }]
        }
    }
])
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末盒件,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锰茉,老刑警劉巖呢蔫,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異片吊,居然都是意外死亡绽昏,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門俏脊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來全谤,“玉大人,你說我怎么就攤上這事爷贫∪先唬” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵漫萄,是天一觀的道長(zhǎng)卷员。 經(jīng)常有香客問我,道長(zhǎng)腾务,這世上最難降的妖魔是什么毕骡? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮岩瘦,結(jié)果婚禮上未巫,老公的妹妹穿的比我還像新娘。我一直安慰自己启昧,他們只是感情好叙凡,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著箫津,像睡著了一般狭姨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上苏遥,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天饼拍,我揣著相機(jī)與錄音,去河邊找鬼田炭。 笑死师抄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的教硫。 我是一名探鬼主播叨吮,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼瞬矩!你這毒婦竟也來了茶鉴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤景用,失蹤者是張志新(化名)和其女友劉穎涵叮,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡割粮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年盾碗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舀瓢。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡廷雅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出航缀,到底是詐尸還是另有隱情朵锣,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布飞傀,位于F島的核電站诬烹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏绞吁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一颜说、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧汰聋,春花似錦、人聲如沸玄妈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酝锅。三九已至奢方,卻和暖如春擒权,著一層夾襖步出監(jiān)牢的瞬間阁谆,已是汗流浹背愉老。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工嫉入, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人熬拒。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓垫竞,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親欢瞪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

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