前端培訓-中級階段(51)- nodeJS操做MongoDB、文檔CURD操做

前端最基礎的就是 HTML+CSS+Javascript。掌握了這三門技術就算入門,但也僅僅是入門,如今前端開發的定義已經遠遠不止這些。前端小課堂(HTML/CSS/JS),本着提高技術水平,打牢基礎知識的中心思想,咱們開課啦(每週四)。html

使用命令操做 MongoDB 數據庫

image.png

數據庫操做

  1. 顯示全部數據庫
    show dbs
  2. 切換數據庫
    use <DATABASE_NAME>。好比說咱們切換到 admin 數據庫 use admin
    若是數據庫不存在,則建立數據庫。若是數據庫存在,則切換到指定數據庫。
  3. 顯示當前操做的數據庫
    db
  4. 顯示當前數據庫下的全部表
    show collections
  5. 刪除當前數據庫,這種危險命令仍是不要學了
    db.dropDatabase()

數據操做

由於沒有表的概念(集合),也不要求字段一致(文檔)。因此咱們直接快樂的操做數據就行了。前端

操做命令爲 db.<collection>.<>,好比咱們查 user 表的記錄 db.user.find()mysql

也可使用 tab 來自動補全。sql

image.png

insert 插入操做

注意: 在 MongoDB 中,集合只有在內容插入後纔會建立! 就是說,建立集合(數據表)後要再插入一個文檔(記錄),集合纔會真正建立。(db.createCollection(name, options) 這種建立命令不會也罷,固然若是你須要定製 options 仍是須要使用的mongodb

  1. 插入一個文檔,若是主鍵重複則報錯。
    db.<collection>.insert(document)
  2. 插入一個文檔,若是主鍵重複則報錯。(3.2+ 新增)
    db.<collection>.insertOne(document)數據庫

    db.collection.insertOne(
       <document>,
       {
          writeConcern: <document>
       }
    )

    參數說明:npm

    • document:要寫入的文檔。
    • writeConcern:寫入策略,默認爲 1,即要求確認寫操做,0 是不要求。
  3. 插入多個文檔,若是主鍵重複則報錯。(3.2+ 新增)
    db.<collection>.insertMany([document1,document2])segmentfault

    db.collection.insertMany(
       <document>,
       {
          writeConcern: <document>, 
          ordered: <boolean>
       }
    )

    參數說明:api

    • document:要寫入的文檔。
    • writeConcern:寫入策略,默認爲 1,即要求確認寫操做,0 是不要求。
    • ordered:指定是否按順序寫入,默認 true,按順序寫入。

image.png

select 查詢操做

  1. 查詢文檔
    db.<collection>.find()微信

    db.collection.find(
        query, 
        projection
    )

    參數說明:

    • query :可選,使用查詢操做符指定查詢條件
    • projection :可選,使用投影操做符指定返回的鍵。查詢時返回文檔中全部鍵值, 只需省略該參數便可(默認省略)
  2. 查詢一個文檔
    db.<collection>.findOne()

update 更新

  1. 更新集合
    db.<collection>.update()

    db.collection.update( 
        <query>, 
        <update>, 
        { 
            upsert: <boolean>, 
            multi: <boolean>, 
            writeConcern: <document> 
        } 
    )

    參數說明:

    • query : update 的查詢條件,相似與 sql 語句中的 update 查詢內的 where 後面的條件。
    • update : update的對象和一些更新的操做符(如$,$inc...)等,也能夠理解爲sql update查詢內set後面的
    • upsert : 可選,這個參數的意思是,若是不存在update的記錄,是否插入objNew,true爲插入,默認是false,不插入。
    • multi : 可選,mongodb 默認是false,只更新找到的第一條記錄,若是這個參數爲true,就把按條件查出來多條記錄所有更新。
    • writeConcern :可選,拋出異常的級別。
  1. 插入一個文檔,若是主鍵重複則更新。(相似於 mysql 中的 insertAndUpdate)(3.2+ 廢棄)
    db.<collection>.save(document)

    db.collection.save( 
        <document>, 
        { 
            writeConcern: <document> 
        } 
    )

    參數說明:

    • document : 文檔數據。
    • writeConcern :可選,拋出異常的級別。

更多實例

// 只更新第一條記錄:
db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );

// 所有更新:
db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );

// 只添加第一條:
db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );

// 所有添加進去:
db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );

// 所有更新:
db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );

// 只更新第一條記錄:
db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );

delete 刪除操做(沒啥用,仍是不會的好)

  1. 刪除集合(刪除全部記錄)
    db.<collection>.drop()
  2. 刪除文檔
    db.<collection>.remove()

    db.collection.remove( 
         <query>, 
         { 
             justOne: <boolean>, 
             writeConcern: <document> 
         } 
     )

    參數說明:

    • query :(可選)刪除的文檔的條件。
    • justOne : (可選)若是設爲 true 或 1,則只刪除一個文檔,若是不設置該參數,或使用默認值 false,則刪除全部匹配條件的文檔。
    • writeConcern :(可選)拋出異常的級別。
  3. 刪除文檔(一個)
    db.<collection>.deleteOne(<query>)
  4. 刪除文檔(多個)
    db.<collection>.deleteMany(<query>)

where 條件

  1. db.col.find({"author":"www.lilnong.top"}).pretty() 查詢全部 author=="www.lilnong.top" 的記錄
  2. db.col.find({"author":/nong/}).pretty() 模糊查詢全部 author包含 nong 的記錄
  3. db.col.find({"likes":{$lt:50}}).pretty() 查詢全部 likes < 50 的記錄
  4. db.col.find({"likes":{$lte:50}}).pretty() 查詢全部 likes <= 50 的記錄
  5. db.col.find({"likes":{$gt:50}}).pretty() 查詢全部 likes > 50 的記錄
  6. db.col.find({"likes":{$gte:50}}).pretty() 查詢全部 likes >= 50 的記錄
  7. db.col.find({"likes":{$ne:50}}).pretty() 查詢全部 likes != 50 的記錄
  8. db.col.find({"likes":{$eq:50}}).pretty() 查詢全部 likes == 50 的記錄
  9. db.col.find({"author":"www.lilnong.top","likes":{$lt:50}}).pretty() 查詢全部 author=="www.lilnong.top" && likes < 50 的記錄
  10. db.col.find({$or:[{"author":"www.lilnong.top"},{"likes":{$gt:50}}]}).pretty() 查詢全部 author=="www.lilnong.top" or likes > 50 的記錄

分頁(Limit 與 Skip)

使用 limit()方法來讀取指定數量的數據
使用 skip() 方法來跳過指定數量的數據

db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

排序

使用 sort() 方法來排序,1 爲升序排列,而 -1 是用於降序排列。

db.COLLECTION_NAME.find().sort({links: 1})
表示以 links 字段升序排列

使用 NodeJS 操做 MongoDB 數據庫

經常使用的有兩個庫,mongodbmongoose

mongodb

The official MongoDB driver for Node.js. Provides a high-level API on top of mongodb-core that is meant for end users.

安裝與引入 mongodb

npm install mongodb --save
var MongoClient = require('mongodb')

await、async 方式調用

image.png

var MongoClient = require('mongodb').MongoClient;
// console.log(MongoClient)
MongoClient.connect(
    'mongodb://localhost:27017/sf-mongodb',
    {},
    async function(err, db){
        if(err) return console.error(err)
        // console.log(db);
        var dbo = db.db('sf-mongodb');
        // var data = await dbo.collection('user').find().toArray();
        // console.log(data)
        
        // 查詢歷史數據
        // data = await find2array(dbo, 'user');
        // console.log(data)
        consoleFindResult(dbo)        

        // 清空歷史數據
        await dbo.collection('user').deleteMany({})
        consoleFindResult(dbo)
        
        // 批量插入數據 CURD之C create
        await dbo.collection('user').insertMany([
            {author: 'www.lilnong.top', operManyCount: 1, operKey: 'insertMany', time: new Date()},
            {author: 'www.lilnong.top', operManyCount: 2, operKey: 'insertMany', time: new Date()}
        ])
        consoleFindResult(dbo, 'C-Many')

        // 單條插入數據 CURD之C create 
        await dbo.collection('user').insertOne({author: 'www.lilnong.top', operKey: 'insertOne', time: new Date()})
        consoleFindResult(dbo, 'C-One')

        // 批量更新數據 CURD之U update
        await dbo.collection('user').updateMany({operKey: 'insertMany'},{$set: {lastUpdateTime: new Date()}})
        consoleFindResult(dbo, 'U-Many')
        
        // 單條更新數據 CURD之U update
        await dbo.collection('user').updateOne({operKey: 'insertMany'},{$set: {lastUpdateTime: new Date()}})
        consoleFindResult(dbo, 'U-One')

        // 讀取數據 CURD之R read
        console.log('R', await dbo.collection('user').find().skip(1).limit(1).toArray())
        
        // 刪除數據 CURD之D delete
        await dbo.collection('user').deleteOne({operKey: 'insertMany'})
        consoleFindResult(dbo, 'D-One')
    }
)

async function find2array(dbo, collection){
    return dbo.collection(collection).find().toArray(); 
}

async function consoleFindResult(dbo, key){
    var data = await find2array(dbo, 'user');
        console.log(key, data.map(v=>JSON.stringify(v)))
}

回調方式調用

比較原始的方式

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/sf-mongodb";
 
MongoClient.connect(
    url, 
    { 
        useNewUrlParser: true 
    }, 
    function(err, db) {
      if (err) throw err;
      var dbo = db.db("sf-mongodb");
      dbo.collection('user').insertOne(
        {author: 'www.lilnong.top', operKey: 'insertOne', time: new Date()}, 
        function(err, res) {
            if (err) throw err;
            console.log("文檔插入成功", res);
        }
      );
      dbo.collection('user').insertMany(
        [
            {author: 'www.lilnong.top', operManyCount: 1, operKey: 'insertMany', time: new Date()},
            {author: 'www.lilnong.top', operManyCount: 2, operKey: 'insertMany', time: new Date()}
        ], 
        function(err, res) {
            if (err) throw err;
            console.log("文檔插入成功", res);
        }
      );
      dbo.collection("user"). find({}).toArray(function(err, result) { // 返回集合中全部數據
        if (err) throw err;
        console.log(result);
      });
      dbo.collection("user").updateOne({}, {$set: {random: Math.random()}}, function(err, res) {
        if (err) throw err;
        console.log("文檔更新成功");
      });
      dbo.collection("user").deleteOne({}, function(err, obj) {
        if (err) throw err;
        console.log("文檔刪除成功");
      });
    }
);

Mongoose

Mongoose 爲模型提供了一種直接的,基於scheme結構去定義你的數據模型。它內置數據驗證, 查詢構建,業務邏輯鉤子等,開箱即用。

我感受就是和一些 ORM 之類的差很少。建立一個模型(model),Mongoose 會自動找到 複數 形式的 collection

支持 MongoDB 的高級( rich )查詢語法。 查詢文檔能夠用 modelfind, findById, findOne, 和 where 這些靜態方法。要了解 Query api 的更多細節,能夠查閱 querying 章節。

安裝與引入 Mongoose

安裝:npm install mongoose --save
引入:mongoose = require('mongoose')

// Mongoose 的一切始於 Schema。
// 每一個 schema 都會映射到一個 MongoDB collection ,並定義這個 collection 裏的文檔的構成。

    var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/sf-mongodb');

var Schema = mongoose.Schema;
var userSchema = new Schema({
    author: String,
    date: { type: Date, default: Date.now }
});
var User = mongoose.model('User', userSchema);

const user = new User({ author: 'lilnong.1' });
user.save().then(() => console.log('init1', 'success'));
// 直接使用對象也是能夠的
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/sf-mongodb');

const User = mongoose.model('User', { author: String });

const user = new User({ author: 'lilnong.2' });
user.save().then(() => console.log('init2', 'success'));

image.png

image.png

CURD

C 保存

const User = mongoose.model('User', { author: String });
const user = new User({ author: 'lilnong' });
user.save().then(() => console.log('init3','success'));

U 更新

const User = mongoose.model('User', { author: String });

User.updateOne(
    {author: 'lilnong.2'}, 
    {author: 'lilnong.3'}
).then(console.log)

R 讀取

const User = mongoose.model('User', { author: String });

// 查詢全量數據
User.find().then(console.log)

// 查詢 author == 'lilnong.test' 的數據
User.find({ author: 'lilnong.test' }).then(console.log)

D 刪除

const User = mongoose.model('User', { author: String });

// 刪除全部 author 爲空的
User.remove({author: null}).then(console.log);

image.png

微信公衆號:前端linong

clipboard.png

參考文獻

  1. 前端培訓目錄、前端培訓規劃、前端培訓計劃
  2. mongoosejs
相關文章
相關標籤/搜索