MongoDB及Nodejs操作mongodb

MongoDB 的簡介

MongoDB是一個基于分布式文件存儲的數(shù)據(jù)庫。由C++語言編寫,旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲解決方案。

MongoDB 術(shù)語/概念

SQL術(shù)語/概念 MongoDB術(shù)語/概念 解釋說明
database database 數(shù)據(jù)庫
table collection 數(shù)據(jù)庫表/集合
row document 數(shù)據(jù)記錄行/文檔
column field 數(shù)據(jù)字段/域
index index 索引
table joins --- 表連接,MongoDB不支持
primary key primary key 主鍵,MongoDB自動將_id字段設(shè)置為主鍵

MongoDB - 數(shù)據(jù)庫

  • 一個mongodb中可以建立多個數(shù)據(jù)庫。
  • MongoDB的單個實(shí)例可以容納多個獨(dú)立的數(shù)據(jù)庫,每一個都有自己的集合和權(quán)限,不同的數(shù)據(jù)庫也放置在不同的文件中。

MongoDB - 文檔

  • 文檔是一組鍵值對
  • MongoDB 的文檔不需要設(shè)置相同的字段,并且相同的字段不需要相同的數(shù)據(jù)類型,這與關(guān)系型數(shù)據(jù)庫有很大區(qū)別,也是 MongoDB 非常突出的特點(diǎn)。
//一個簡單的文檔例子
{"genres": ["犯罪", "劇情"], "title": "肖申克的救贖"}

MongoDB - 集合

  • 集合就是MongoDB的文檔集合。類型于關(guān)系型數(shù)據(jù)庫中的表格。
  • 集合存在于數(shù)據(jù)庫中,集合沒有固定的結(jié)構(gòu),這意味著你在對集合可以插入不同格式和類型的數(shù)據(jù),但通常情況下我們插入集合的數(shù)據(jù)都會有一定的關(guān)聯(lián)性。
//一個簡單的集合例子
{"genres": ["犯罪", "劇情"], "title": "肖申克的救贖"}  //文檔
{"genres": ["搞笑", "無聊"], "title": "李茶的姑媽"}
{"genres": ["好看"], "title": "無雙", "stars": 9}

MongoDB 語句來操作數(shù)據(jù)庫

show dbs  //顯示數(shù)據(jù)庫 (無內(nèi)容數(shù)據(jù)庫不顯示)
db/db.getName() //查看當(dāng)前所處數(shù)據(jù)庫
use XXX  //創(chuàng)建/切換數(shù)據(jù)庫

db.stats()  //顯示當(dāng)前db狀態(tài)
db.dropDatabase() //刪除當(dāng)前數(shù)據(jù)庫

  • insertOne
  • insertMany
- db.XXX.insertOne({}) //XXX表名 
- db.XXX.insertMany({name:'zhangshan',age:19},{name:'lisi',age:20})   //增加多條

  • deleteOne
  • deleteMany

  • updateOne
  • updateMany
- db.XXX.updateOne(查詢條件,修改內(nèi)容)
- db.XXX.updateMany(查詢條件,修改內(nèi)容)

db.hello.updateOne({name:'zhangshan'},{$set : {age:20}}) //修改一條
db.hello.updateMany({name:'zhangshan'},{$set : {age:20}}) //修改多條

db.XXX.find()  //查詢所有記錄 sql:select * from users

db.XXX.find(查詢條件)
db.XXX.find({'age': 22}); //查詢 age = 22 的記錄  select * from users where age = 22;
db.XXX.find({age:{$gt:20}}) //查詢年齡大于20的
db.XXX.find({age:{$lt:20}}) //查詢年齡小于20的
db.XXX.find({age:{$gte:20}}) //查詢年齡大于等于20的
db.XXX.find({age:{$1te:20}}) //查詢年齡小于等于20的
db.XXX.find({'age': {$ne: 22}}); //查詢 age != 22 的記錄

db.XXX.find({'age': {$gte: 23, $lte: 26}}); //查詢 age >= 23 并且 age <= 26
db.XXX.find({$or: [{age: {$gte: 23}}, {name: '張三'}]); //查詢 age >= 23 或者 name == '張三'

db.XXX.find({'name': /mongo/}); //查詢 name 中包含 mongo 的數(shù)據(jù)  select * from users where name like %mongo%;
db.XXX.find({'name': /^mongo/}); //查詢 name 中已 mongo 開頭的數(shù)據(jù)
db.XXX.find({'name': /mongo$/}); //查詢 name 中已 mongo 結(jié)尾的數(shù)據(jù)

db.XXX.find({}, {name: 1, age: 1}); //查詢 指定列 name 、age 的數(shù)據(jù)
db.XXX.find({age: {$gt: 25}}, {name: 1, age: 1}); //查詢 指定列 name 、age 并且 age > 25

db.XXX.find().sort({age: 1}); //升序 倒序傳-1

db.XXX.find({name:'zhangshan'},{age:20}) //查詢 name = zhangsan , age = 20 的數(shù)據(jù)

db.XXX.find().limit(5); //查詢 前5條數(shù)據(jù)
db.XXX.find().skip(10); //查詢 10條以后的數(shù)據(jù)
db.XXX.find().limit(10).skip(5); //查詢 在 5 - 10 之間的數(shù)據(jù)
db.XXX.find().count(); //查詢 某個結(jié)果集的記錄條數(shù)

db.XXX.findOne(); //查詢第一條數(shù)據(jù)

使用 skip() 與 limit() 實(shí)現(xiàn)分頁

  1. pageNum 當(dāng)前第幾頁
  2. pageSize 每頁顯示多少條
  3. totalPage 一共有幾頁 Math.ceil (totalSize/pageSize)
  4. totalSize 一共有多少條數(shù)據(jù) db.XXX.find().count()
第一頁: db.XXX.find().skip((pageNum - 1) * pageSize).limit(pageSize)
第二頁: db.XXX.find().skip(10).limit(10)
第三頁: db.XXX.find().skip(20).limit(10)
第四頁: db.XXX.find().skip(30).limit(10)

Mongoose

是一款能夠在 nodejs 中操作 MongoDB 數(shù)據(jù)庫的模塊

兩個核心概念點(diǎn)

  • schema
    表示數(shù)據(jù)庫表結(jié)構(gòu)的一種格式
{
    key : value
    key -> 表中字段的名字
    value -> string | object
    
    name : string
    age :number
    password: {
        type :string,   //傳遞的數(shù)據(jù)類型
        required :true,  //表示這個字段必須要傳遞
        default : '123'  //默認(rèn)值
    }
}
  • model
    基于某個 schema 生成的某個表的模型對象,生成的模型對象上就有一系列的對數(shù)據(jù)庫這張表操作的方法

使用步驟

創(chuàng)建文件 npm init -y(初始化) -> npm install --save express(安裝依賴)

  1. 安裝 mongoose npm install --save mongoose
  2. 建立 MongoDB 鏈接對象
  3. 創(chuàng)建某張表的 schema 與相對應(yīng)的 model
  4. 基于第3步中的 model 來對這張表進(jìn)行操作(server.js)
  • 2.建立 MongoDB 鏈接對象 :在項目目錄下創(chuàng)建文件夾(進(jìn)行配置 config) ->創(chuàng)建js文件(作用:暴露數(shù)據(jù)鏈接了MongoDB的mongoose對象)
//1.引入 mongoose
const mongoose = require("mongoose");

//2.定義數(shù)據(jù)庫的鏈接地址  37代表數(shù)據(jù)庫的名字
const url = 'mongodb://127.0.0.1:27017/37';  //這里是mongodb協(xié)議 MongoDB的端口號為27017

//3.mongoose.connect 方法來鏈接 返回的是promise對象
mongoose
  .connect(url, { useNewUrlParser: true })  //connect參數(shù)2是個對象 為可選參數(shù) 當(dāng)出現(xiàn)useNewUrlParser警告時 再來設(shè)置
  .then(() => {
    console.log("數(shù)據(jù)庫鏈接成功");
  })
  .catch(err => {
    console.log("數(shù)據(jù)庫鏈接失敗", err.message);
  });

// 4. 暴露已經(jīng)鏈接了數(shù)據(jù)庫的 mongoose 對象
module.exports = mongoose;
  • 3.創(chuàng)建某張表的 schema 與相對應(yīng)的 model : 在項目目錄下創(chuàng)建文件夾 (用于生成模型對象的 models) -> 創(chuàng)建js文件(作用:生成XXX表的模型對象)
1. 引入鏈接了數(shù)據(jù)庫的 mongoose 對象 (鏈接前面暴露出來的js文件)
const db = require('../XXjs');

2. 定義這張表(集合)的 schema 對象
const schema = new db.Schema({   //db中有一個Schema的構(gòu)造函數(shù) 設(shè)置需要的字段格式
  // key: value 的設(shè)置
  name: {
    type: String, //類型首字母大寫
    required: true  //定義必須存在
  },

  age: {
    type: Number,
    default: 18  //默認(rèn)為18
  },

  sex: {
    type: Number,
    default: 1
  }
});

3. 基于第2步中的 schema 生成 model 對象并暴露model   db.model()方法
module.exports = db.model('student',schema); //數(shù)據(jù)庫的表名是根據(jù) db.model 第一個參數(shù)的復(fù)數(shù)形式來確定的
  1. 基于第3步中的 model 來對這張表進(jìn)行操作(server.js)
//點(diǎn)出重點(diǎn)和一些使用方法

//引入3中生成的model對象
const StudentModel = require('./models/student');

//req.query 獲取get請求傳遞過來的參數(shù)
//req.body 獲取post請求傳遞過來的參數(shù)

//增 
//生成模型的實(shí)例對象如student 
//將實(shí)例對象(其中的數(shù)據(jù)從前端獲得)寫入數(shù)據(jù)庫
student.save() //save() 往數(shù)據(jù)庫插入數(shù)據(jù)時,會更新重復(fù)的數(shù)據(jù)

//查(這里是獲取所有數(shù)據(jù)給前端)
StudentModel.find()  可獲取所有的數(shù)據(jù)

//改
StudentModel.updateOne() //(只修改一個){要修改的條件(數(shù)據(jù)庫中修改參數(shù)的名字),要修改的內(nèi)容}

//刪
 StudentModel.deleteOne()  //只刪除一個
 
//分頁
//pageNum 當(dāng)前第幾頁
//pageSize 每頁顯示多少條
//totalPage 一共有幾頁       Math.ceil (totalSize/pageSize) 
//totalSize 一共有多少條數(shù)據(jù)    db.XXX.find().count(

Robo 3T 1.3 :圖像化界面

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Mongodb 配置選項 通常在mongod.conf中 配置文件 設(shè)置了配置文件后啟動時以自定義的配置文件啟動:...
    AkaTBS閱讀 1,145評論 0 6
  • MongoDB 1. MongoDB 是一個基于分布式文件存儲的數(shù)據(jù)庫。由 C++ 語言編寫。旨在為 WEB 應(yīng)用...
    Kevinr閱讀 1,709評論 0 3
  • mongoose入門 MongoDB是一個開源的NoSQL數(shù)據(jù)庫,相比MySQL那樣的關(guān)系型數(shù)據(jù)庫,它更顯得輕巧、...
    huilegezai閱讀 4,562評論 0 14
  • mongoDB簡介 mongoDB與一些關(guān)系型數(shù)據(jù)庫相比,它更顯得輕巧、靈活,非常適合在數(shù)據(jù)規(guī)模很大、事務(wù)性不強(qiáng)的...
    Dr老爹閱讀 1,257評論 0 2
  • 在講項目之前,我們先來講一些概念,因為大家還沒有學(xué)ES6,所以這次以ES5語法來講內(nèi)容。 一、數(shù)據(jù)庫MongoDB...
    好一只帥鹵蛋閱讀 1,280評論 0 9

友情鏈接更多精彩內(nèi)容