MongoDB隨記

  1. 使用數(shù)據(jù)庫: use test

  2. 顯示當(dāng)前庫中的所有集合(相當(dāng)于關(guān)系型數(shù)據(jù)庫中的表): show collectionsshow dbs

  3. 顯示當(dāng)前庫中所有的集合名: db.getCollectionNames()

  4. 開啟數(shù)據(jù)庫認證(linux系統(tǒng)在/etc/mongod.conf(mongodb3.x及以上版本)或/etc/mongodb.conf):

    # mongod.conf(3.x及以上版本):
    security:
      authorization: enabled
    # mongdb.conf:
    auth=true
    
  5. 設(shè)置用戶:

    use admin // 進入到admin庫中去設(shè)置
    db.createUser(
      {
        user: "用戶名",
        pwd: "密碼",
        roles: [{role: ["角色列表"], db: "admin"}]
      }
    )
    // 設(shè)置完畢后重啟mongoDB數(shù)據(jù)庫服務(wù)
    // 然后重新進入mongodb客戶端驗證是否用戶設(shè)置成功:
    use admin
    db.auth("用戶名", "密碼")
    // 或者執(zhí)行命令時直接指定
    mongo --port 27017 -u "用戶名" -p "密碼" --authenticationDatabase "admin"
    
  6. Ubuntu 16.x中對服務(wù)的操作

    service [服務(wù)名] start  # 啟動服務(wù)器 
    service [服務(wù)名] stop  # 啟動服務(wù)器 
    
  7. 查看服務(wù)的狀態(tài)

    systemctl status [服務(wù)器]
    
  1. 添加(插入)

    1. db.<collection>.insert() 向集合中插入一個或多個文檔

      // 插入一個文檔
      db.stus.insert({name: "豬八戒", age: 28, gender: "男"});
      // 插入多個
      db.stus.insert([
          {name: "沙和尚", age: 38, gender: "男"},
          {name: "白骨精", age: 16, gender: "女"}
      ]);
      // 默認_id屬性表示數(shù)據(jù)唯一性
      _id: ObjectId("5e97359053f77289926c54e4");
      // 如果自己手動添加了_id牺弄,則數(shù)據(jù)庫就不會自動生成時間戳Id屬性了(數(shù)據(jù)必須唯一,所以建議還是使用數(shù)據(jù)庫自帶的)
      
    2. db.<collection>.insertOne() 向集合中插入一個文檔version3.2中新加的

    3. db.<collection>.insertMany() 想集合中插入多個文檔version3.2中新加的

  2. 查詢

    1. db.<collection>.find() 如果不傳入?yún)?shù)宜狐,則直接查詢所有數(shù)據(jù)

      // 查詢stus集合中的所有數(shù)據(jù)(返回一個數(shù)組)
      db.stus.find();
      // 同上势告,查詢集合中所有數(shù)據(jù)(返回一個數(shù)組)
      db.stus.find({});
      // 查找_id值為“hello”的文檔(符合條件的均會查找出來,返回數(shù)組)
      db.stus.find({_id: "hello"});
      // 查找符合age是16且name為"hello"的文檔(AND, 返回數(shù)組)
      db.stus.find(age: 16, name: "hello");
      // 查詢集合中符合條件的第一條記錄(只返回一個對象)
      db.stus.findOne({name: "hello"});
      // 如果要通過內(nèi)嵌文檔對文檔進行查詢,此時需要屬性名使用引號(單引號抚恒、雙引號都可)
      db.users.find({"hobby.movies": "hero"});
      // 統(tǒng)計文檔的數(shù)量(符合條件的數(shù)據(jù)數(shù)據(jù)量) == 更常用
      db.stus.find({}).count();
      // 同上, 一般情況下數(shù)量相同
      db.stus.find({}).length();
      // 設(shè)置顯示數(shù)據(jù)的上限(即獲取多少條數(shù)據(jù)), skip與limit方法順序沒有限定
      db.numbers.find().skip(`要跳過的條目數(shù)`).limit(`獲取多少數(shù)據(jù)`);
      // 排序(大于0升序咱台,小于0降序)
      // 多個排序規(guī)則逗號分隔,類似sql語句中的order by
      db.numbers.find().sort({`要排序的字段`: `大于0的值或小于0的值`,`要排序的字段`: `大于0的值或小于0的值`, ...});
      // limit俭驮、skip回溺、sort可以任意順序調(diào)用: 數(shù)據(jù)庫的執(zhí)行順序都是: sort、skip混萝、limit
      // 在查詢時可以在第二個參數(shù)的位置設(shè)置查詢結(jié)果的投影(類似sql里邊的查詢字段)
      db.emp.find({}, {ename: 1, _id: 0, ...}) // 可以給查詢結(jié)果給出要顯示的字段: 1顯示真朗,0不顯示
      

      查詢操作符:

      $eq 等于
      $gt 大于
      $gte 大于等于
      $in 包含少漆,相當(dāng)于sql中的in
      $lt 小于
      $lte 小于等于
      $ne 不等于
      $nin 不包含轮洋,相當(dāng)于sql中的not in
      
  1. 更新

    1. db.<collection>.update(查詢條件碰纬,新對象)

      // 更新前一般先查詢, 默認情況下會用新對象替換舊對象
      // 默認情況下只會修改一個, 第三個參數(shù)可選
      db.stus.update({name: "沙和尚"}, {age: 28}, {
          upsert: <boolean值>,
       multi: <boolean值>, // 默認不修改多個
          writeConcern: <document: 即對象>,
          collation: <document:  即對象>
      });
      // 如果修改指定的屬性,而不是替換崭倘,則需要使用修改操作符
      // 語法: operation: {....}
      db.stus.update({_id: ObjectId(9fd43243258923dcdf)}, {$set: {name: "沙和尚"}});
      // 刪除文檔的指定屬性
      db.stus.update({_id: ObjectId(xxxx)}, {$unset: {name: "因為是刪除屬性翼岁,所以什么值都行"}});
      // 同時修改多個符合條件的文檔
      db.stus.updateMany({_id: ObjectId(473892478923784923)}, {$set: {address: "高辣莊"}});
      // 向數(shù)據(jù)庫中的數(shù)組屬性追加數(shù)據(jù)
      db.stus.update({_id: ObjectId(473892478923784923)}, {$push: {address: "高辣莊"}});
      // 向數(shù)據(jù)庫中的數(shù)組屬性追加數(shù)據(jù)(數(shù)據(jù)重復(fù)不追加)
      db.stus.update({_id: ObjectId(473892478923784923)}, {$addToSet: {address: "高辣莊"}});
      // 只更改單個數(shù)據(jù)
      db.stus.updateOne({name: "沙和尚"}, {age: 28});
      // 替換文檔
      db.stus.replaceOne({name: "沙和尚"}, {age: 28});
      
  2. 刪除

    1. db.<collection>.remove({刪除條件}, {可選參數(shù)});
    // 刪除符合條件的數(shù)據(jù)(數(shù)據(jù)有多個則一起刪除)
    db.stus.remove({_id: "hello"});
    // 刪除符合條件的一個數(shù)據(jù)(如果有多個,則只刪除第一個)
    db.stus.remove({_id: "hello"}, {
        justOne: <boolean值>,
        writeConcern: <document: 即對象>
    });
    // 刪除所有(傳空時表示全部刪除, 性能較差)
    db.stus.remove({});
    // 所有要刪除直接移除集合即可(如何集合全部沒有后司光,數(shù)據(jù)庫也隨之刪除)
    db.stus.drop();
    // 刪除數(shù)據(jù)庫
    db.dropDatabase();
    // 刪除一條數(shù)據(jù)
    db.stus.deleteOne({_id: "hello"});
    // 刪除多條數(shù)據(jù)
    db.stus.deleteMany({_id: "hello"});
    
  3. Mongoose

    安裝依賴: yarn i mongoose --save 或者 npm i mongoose --save

    // 引入Mongoose依賴
    const mongoose = require('mongoose');
    // 連接mongoDB數(shù)據(jù)庫
    // 連接格式: mongodb://[username:password]@127.0.0.1/databaseName?authSource=[用戶保存的數(shù)據(jù)庫名]
    mongoose.connect('mongodb://localhost/test', {useNewUrlParser: true, useUnifiedTopology: true});
    
    // 連接成功后回調(diào)
    mongoose.connection.once("open", () => {
       console.log("MongoDB數(shù)據(jù)庫鏈接成功!")
    });
    
    // 斷開連接前回調(diào)
    mongoose.connection.once("close", () => {
        console.log("MongoDB數(shù)據(jù)庫斷開連接!");
    });
    
    /**
     * MongoDB一般情況只需要連接一次就可琅坡,除非項目停止,
     * 服務(wù)器關(guān)閉残家,否則連接一般不會斷開榆俺。
     * (關(guān)系型數(shù)據(jù)庫需要操作事務(wù),所以每次操作完畢都需要進行一次斷開連接跪削,但是MongoDB是菲關(guān)系型數(shù)據(jù)庫
     * 沒有事務(wù)控制谴仙,所以不需要考慮事務(wù)問題。)
     */
    // mongoose.disconnect();
    
    
    /**
     * mongoose 提供了三個核心對象
     * 1. Schema 建立檔案時的約束
     * 2. Model  -> 對應(yīng)Collection (相當(dāng)于關(guān)系型數(shù)據(jù)庫中的表)
     * 3. Document -> 對應(yīng)記錄 (相當(dāng)于關(guān)系型數(shù)據(jù)的每行的記錄數(shù)據(jù))
     */
    
    let Schema = mongoose.Schema;
    // 創(chuàng)建表的約束
    let testSchema = new Schema({
        name: String,
        addr: String,
        create_time: {
            type: Date,
            default: Date.now
        }
    });
    
    
    // 創(chuàng)建Model: 因為對應(yīng)的是集合碾盐,所以最好使用大寫命名
    // mongoose 會動將集合名變成為復(fù)數(shù)
    let TestModel = mongoose.model("test", testSchema);
    
    
    /**
     * 相關(guān)Model:
     * 用于創(chuàng)建文檔(一個或多個,即一個對象或?qū)ο髷?shù)組)揩局,并添加到集合中
     * 1.Model.create(doc(s), (err) => {}) // callback: 完成操作后的回調(diào)函數(shù)
     *      回調(diào)函數(shù)有兩個參數(shù): 1: err -> 錯誤對象  2: 插入成功的數(shù)據(jù)
     * 2. Model.findById("ID值字符串" , ..., (err, doc) => {查詢的數(shù)據(jù), doc為document對象, 是Model的一個實例} )  通過主鍵ID查詢, 回調(diào)函數(shù)中返回的Document對象
     * 3. Model.findOne()   只查詢一個數(shù)據(jù)
     * 4. Model.find({查詢條件對象},”字段投影, 多個字段空格隔開毫玖,如果不需要則在前面加個一個減號:-“ | {可以使用傳統(tǒng)的投影方式,即需要顯示字段為key,值取1為顯示付枫,0不顯示},{skip: 10 [跳過多少條數(shù)據(jù)] , limit: 2 [取幾條數(shù)據(jù)], sort: 1 [排序升序]} , (err, doc) =>{返回的數(shù)據(jù), doc為document對象烹玉,是Model的一個實例})      查詢數(shù)據(jù)(返回數(shù)組)
     * 5. Model.update({查詢條件}, {修改修飾符: {要修改的數(shù)據(jù)}}, {multi(多數(shù)據(jù)影響): true}[可選參數(shù)]  , (err) = > {回調(diào)函數(shù)}) 符合條件的都更新
     * 6. MOdel.updateOne() 更新一個
     * 7. Model.remove({刪除條件}, (err)=>{回調(diào)函數(shù)});
     * 7. Model.deleteOne({刪除條件}, (err)=>{回調(diào)函數(shù)});
     * 7. Model.deleteMany({刪除條件}, (err)=>{回調(diào)函數(shù)});
     * 8. Model.count({要統(tǒng)計的數(shù)據(jù)條件}, (err, data) => {回調(diào)函數(shù),data為統(tǒng)計的結(jié)果});
     */
    
    /**
     * Document相關(guān)
     * 1. new Model({
     *     對象數(shù)據(jù)
     * }); -> 創(chuàng)建一個Document對象
     * 2. Document實例.save() -> 保存數(shù)據(jù)
     * 3. Document實例.update({修改的數(shù)據(jù)}, (err, data) => {
     *     //...
     * }) -> 保存數(shù)據(jù)
     * 4. doc.[字段名] = 值; doc.save() -> 也可以保存數(shù)據(jù)
     * 6. doc.get(字段名名) -> 獲取文檔的對應(yīng)屬性值    doc.屬性值 -> 也可以獲取對應(yīng)屬性值
     * 7. doc.set(Key,Value) -> 修改文檔對應(yīng)屬性的值, 但沒有調(diào)用save之前不會保存到數(shù)據(jù)庫中
     * 8. doc._id 或 doc.id -> 獲取主鍵值
     **9. doc.toJSON() 轉(zhuǎn)換為JSON對象
     * 10.doc.toObject() 將document對象轉(zhuǎn)成普通的js對象
     * 11. doc對象無法使用delete
     */
    
    // 插入一條新數(shù)據(jù)
    TestModel.create({
        name: "孫悟空",
        addr: "花果山水簾洞"
    }, (err) => {
        if(!err){
            console.log("新增成功!");
        }
    });
    
    // 統(tǒng)計數(shù)據(jù)結(jié)果
    TestModel.count({}, (err, data) => {
        console.log(data);
    });
    
    // 插入多條數(shù)據(jù)
    TestModel.create([
        {
            name: "豬八戒",
            addr: "摩云洞"
        },
        {
            name: "唐僧",
            addr: "東土大唐"
        }
    ], (err) => {
        if(!err){
            console.log("新增成功!");
        }
    });
    

命名規(guī)范:

  1. 集合是多個,所有一般使用單詞復(fù)數(shù)來命名
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末阐滩,一起剝皮案震驚了整個濱河市二打,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掂榔,老刑警劉巖继效,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異装获,居然都是意外死亡瑞信,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門穴豫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凡简,“玉大人,你說我怎么就攤上這事精肃〕由” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵司抱,是天一觀的道長溉仑。 經(jīng)常有香客問我,道長状植,這世上最難降的妖魔是什么浊竟? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮津畸,結(jié)果婚禮上振定,老公的妹妹穿的比我還像新娘。我一直安慰自己肉拓,他們只是感情好后频,可當(dāng)我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著暖途,像睡著了一般卑惜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上驻售,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天露久,我揣著相機與錄音,去河邊找鬼欺栗。 笑死毫痕,一個胖子當(dāng)著我的面吹牛征峦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播消请,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼栏笆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了臊泰?” 一聲冷哼從身側(cè)響起蛉加,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缸逃,沒想到半個月后针饥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡察滑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年打厘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贺辰。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡户盯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出饲化,到底是詐尸還是另有隱情莽鸭,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布吃靠,位于F島的核電站硫眨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏巢块。R本人自食惡果不足惜礁阁,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望族奢。 院中可真熱鬧姥闭,春花似錦、人聲如沸越走。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽廊敌。三九已至铜跑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間骡澈,已是汗流浹背锅纺。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留秧廉,地道東北人伞广。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓拣帽,卻偏偏與公主長得像疼电,于是被迫代替她去往敵國和親嚼锄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,500評論 2 359

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

  • Mongodb 配置選項 通常在mongod.conf中 配置文件 設(shè)置了配置文件后啟動時以自定義的配置文件啟動:...
    AkaTBS閱讀 1,084評論 0 6
  • 1.express node Web應(yīng)用框架蔽豺,提供了很多Web應(yīng)用和HTTP工具 使用express可以快速搭建一...
    昵稱不能太隨便閱讀 1,330評論 0 2
  • 1 Native Driver (官方驅(qū)動) 1.1 安裝 1.2 連接MongoDB服務(wù) 示例 連接需要驗證的服...
    向前端看齊的安小艷閱讀 391評論 0 0
  • mongoDB簡介 mongoDB與一些關(guān)系型數(shù)據(jù)庫相比区丑,它更顯得輕巧、靈活修陡,非常適合在數(shù)據(jù)規(guī)模很大沧侥、事務(wù)性不強的...
    Dr老爹閱讀 1,106評論 0 2
  • 模糊查詢
    饑人谷_米彌輪閱讀 69評論 0 0