MongoDB初識

詳情戳這裏!全棧之巔
 
5 MongoDB基礎
本節介紹如何在express中用mongoose鏈接MongoDB數據庫進行操做。
 
以前的porducts接口中,有固定的數據。實際狀況下,數據都是靈活可變的。能夠經過某些方式新增、修改、刪除數據等。那麼數據就須要放進數據庫。
 
數據庫相似excel,有分頁、按條件篩選等功能。
 
express中經常使用 MongoDB數據庫。
 
  • 首先去下載mongoDB的server。
  • 而後安裝 node 中用來鏈接數據庫的mongoose
cnpm i mongoose
 
在MongoDB中,保存一類數據的(好比說有一樣屬性的:用戶、產品信息等)結構稱爲 集合,或者叫模型,也能理解爲表
在安裝MongoDB後,在node中鏈接MongoDB的程序是mongoose。
MongoDB的一個特色是,能夠自定義表,隨後這個數據庫就會自動建立。那麼
  • 就首先鏈接數據庫,
  • 而後建立一個集合,
  • 而後插入數據,
  • 而後查詢其中數據便可。
const express = require('express');
 
const app = express();
 
const mongoose =require('mongoose');
 
 
// 參數一爲數據庫地址,每一個數據庫都是一個服務器,因此是一個網絡地址。
// 本地可使用127.0.0.1或者localhost。
// 地址標準爲 mongodb:// Ip地址 :端口號(默認爲27017)/數據庫名稱(此處能夠自定義,mongodb
// 會自動建立對應表)
// 注意第二個參數是新版本要求的。
mongoose.connect(' mongodb://localhost:27017/express-test',{ useNewUrlParser: true });
// 數據庫中,對應的東西須要分類存放,好比用戶放在用戶類中
// 在 mongdodb中,這個類叫作集合,一個集合中能夠放不少行數據
// 相似 excel。
// 下面假設有一個產品表。對應 創建一個模型。表-模型-集合,能夠同等看待。在mongodb中叫集合。
// 慣例,這個模型名字都是大寫
// 參數一是模型名稱,參數二是表結構。
// 參數二定義了表中的字段/屬性,傳遞一個對象
const Product =mongoose.model('Product',new mongoose.Schema({
title:Number,
name:String
}));
// 測試用。
// Product.insertMany(
// [
// {title:1,name:'product1'},
// {title:2,name:'product2'},
// {title:3,name:'product3'}
// ]
// );
 
app.use(require('cors')())
 
app.use('/',express.static('public'))
 
app.get('/about',function(req,res){
res.send([
{page:'about'}
])
})
 
// 若是下面用了await,那麼上面就要使用async
// 表示他是一個異步函數。 這是成對出現的。
app.get('/products',async function (req,res) {
// 每一次 數據庫查詢都是從Node數據庫 的異步操做
// 因此要await
res.send(await Product.find())
})
 
app.listen(3000,()=>{
console.log("App is listening on port: 3000!")
})
 
鏈接數據庫:
  • mongoose.connect函數。
    • 參數一爲數據庫地址
    • 地址標準爲 mongodb:// ip地址 :端口號(默認爲27017)/數據庫名稱(此處能夠自定義,mongodb 會自動建立對應表
    • 參數二是按照報錯提示添加的。
建立模型:
  • mongoose.model函數。
    • 參數一爲模型名稱,慣例首字母大寫。
    • 參數二傳入表的數據內容格式,mongoose.Schema函數
      • 內部相似接口。但注意數據類型是首字母大寫的。
插入數據:
  • mongoose.insertMany函數。
  • 很明顯,此處插入的數據是由數組傳遞的對象,而對象格式按照接口規定填寫
  • 若是傳錯了,可能會出錯?可是當前版本4.1( MongoDB)是作了並集的添加。
  • 不要寫id或者_id。也不該該寫__v。由於這是MongoDB的默認數據名。
查詢數據:
  • 查詢操做是異步操做,請使用async /await。這兩個標誌成對出現。
  • 使用Product上的find方法就能查詢、返回數據庫中的json數據。

6 MongoDB查詢
 
上一節,講到了基本的MongoDB查詢,就是對模型調用find方法,基本上是查詢當前模型中全部的記錄。本節,繼續深刻了解細分的數據庫查詢。
 
重提一次,async 和 await是成對出現的。 每一個查詢數據庫的操做都是一個異步操做。
 
排序:
app.get('/products',async function (req,res) {
// 每一次 數據庫查詢都是從Node數據庫 的異步操做
// 因此要await
res.send(await Product.find().sort({
_id:-1
}))
})
按照id查詢
app.get('/products/:id',async function(req,res){
const data =await Product.findById(req.params.id);
res.send(data)
})
限定顯示n個
app.get('/products/1',async (req,res)=>{
const data =await Product.find().limit(1);
res.send(data)
})
跳過n個
app.get('/products/1',async (req,res)=>{
const data =await Product.find().skip(2).limit(1);
res.send(data)
})
按照(傳入的對象)條件查詢
這裏傳入的對象就是表示,要查詢什麼字段,字段的值是多少。 ---什麼字段,什麼值。返回有這個指定字段和對應的值得數據。
app.get('/products/1',async (req,res)=>{
const data =await Product.find().where({
name:"product5"
});
res.send(data)
})
基本上都是跟在一個模型以後的find類方法。
 

MongoDB新增產品和post請求
 
以前使用insertMany這種程序化的手段新增了數據,下面介紹新增產品的接口
 
get 請求是在網頁中輸入地址來獲取資源的方式。默認用於獲取數據。提交數據,通常使用post方法定義路由。
如今vscode中安裝擴展,rest client。用於在vscode中,用代碼的方式發起http請求。
 
在根目錄新建文件 test.http就可使用rest client發送請求了。
 
rest client 語法簡單介紹
@uri =http://localhost:3000/
###
 
 
 
 
GET {{uri}}products
###
 
 
GET {{uri}}products/1
 
 
###
 
 
POST {{uri}}products
Content-Type: application/json
 
 
{
"title":626464
}
###
GET {{uri}}products/5cfba45e2318f831508ba40d
  • 用雙大括號插值
  • 用@定義變量
  • 用三個井號分割請求
  • 設置請求頭類型,對應請求數據的類型
  • 注意請求頭和發送數據之間必須要有空行
  • 注意post數據的格式要符合(以前規定的)數據庫中數據的格式。
 
服務端解析json數據、獲取json數據。
 
 
const express = require('express');
 
 
const app = express();
 
 
const mongoose =require('mongoose');
app.use(require('cors')())
 
app.use(express.json());
// 容許express處理提交到服務器的json數據。
 
//發送的post請求的json數據在req.body中儲存。
// 在數據庫中新增 一個數據
 
app.post('/products',async (req,res) => {
    const data =req.body;
    const product =await Product.create(data);
    res.send([data,product]);
})
app.listen(3000,()=>{
console.log("App is listening on port: 3000!")
})
相關文章
相關標籤/搜索