mongodb的基礎瞭解
MongoDB
mongodb 文件型資料庫 類json binary json 非關係型 (nosql)
資料庫 (db) 集合(collection)表 文件(document) 資料
安裝配置
* 有一個左下角小箭頭 千萬取消
* 缺少 api-win-ms 檔案 去postman 找
* 缺少檔案 C/data/db
* mongod 執行資料庫
* mongo 通過終端(cmd 命令列) 連結資料庫 並且可以執行 查詢語句
* mongodb 資料庫
* mongoose node的第三方外掛 用來連結資料庫
* mongodb node的第三方外掛 用來連結資料庫
*db操作
db 指代當前使用的資料庫
show dbs (databases) 顯示所有的資料庫
use dbname 切換資料庫 建立資料庫(如果資料庫為空則為臨時資料庫)
如果要建立非臨時資料庫 在db裡面建立一個集合
db.dropDatabase();
*collection操作
db.createCollection('name') 建立一個集合
show collecitons 檢視當前所有的集合
db.name.drop() 刪除資料集合
*document操作
插入 db.name.insert(obj)
* 插入多條資料引數為陣列 db.name.insert([{},{},{}]
* 插入是如果指定_id _id必須為唯一不重複
插入 db.name.save(obj)
* 如果主鍵不重複 等同於插入
* 如果主鍵重複 那就是覆蓋
查詢 db.name.find(obj)
固值尋找
尋找age集合裡面所有含有屬性值為wscats的文件結果,相當於where name = 'wscats'
db.age.find({name:"wscats"})
*db.name.find({key1:vale,key2:value......})
*db.name.find({age:{$lt:17}})
db.name.find().pretty() 將find查詢的資料進行格式化 目的好看一點
AND和OR尋找
AND
在find()方法中,如果通過使用,將它們分開傳遞多個鍵,則mongodb將其視為AND條件。 以下是AND的基本語法
尋找_id為1並且name為wscats的所有結果集
db.age.find( { $and: [ {"_id": 1}, {"name": "wscats"} ] } )
OR
在要根據OR條件查詢文件,需要使用$or關鍵字。以下是OR條件的基本語法
尋找name為corrine或者name為wscats的所有結果集
db.age.find( { $or: [ {"name": "corrine"}, {“name“: "wscats"} ] } )
AND和OR等結合
相當於語句where title = "wscats" OR ( title = "corrine" AND _id < 5)
db.age.find({ $or: [{ "title": "wscats" }, { $and: [{ "title": "corrine" }, { "_id": { $lte: 5 } }] }] })
修改
db.name.update({查詢條件},{$set 修改的資料},{multi:修改多條}) //修改更新
* 只修改第一條查到的資料
刪除 db.name.remove(obj)
* db.name.remove({}) 全部刪除
skip: 跳過幾條
limit: 限制幾條資料
sort:1 正序 -1 倒敘
skip和limit 順序無干系 都是先跳過後限制
Limit與Skip方法
Limit
如果你需要在mongodb中讀取指定數量的資料記錄,可以使用mongodb的Limit方法,limit()方法接受一個數字引數,該引數指定從mongodb中讀取的記錄條數。
db.age.find().limit(數量)
Skip
我們除了可以使用limit()方法來讀取指定數量的資料外,還可以使用skip()方法來跳過指定數量的資料,skip方法同樣接受一個數字引數作為跳過的記錄條數。
db.age.find().limit(數量).skip(數量) //skip()方法預設值為0
所以我們在實現分頁的時候就可以用limit來限制每頁多少條資料(一般固定一個值),用skip來決定顯示第幾頁(一個有規律變動的值)
#####主鍵
* _id 唯一不重複 mongodb中主鍵可以自動生成 objectId 也可以人為指定
* 在mongodb中沒有表頭的概念 插入的資料長度不限制 可以插入每一條都不一樣的資料
##### 分頁
page 代表頁數 1
pagesize 每頁數量 2
db.name.find().skip((page-1)*pagesize).limit(pagesize)
排序
在mongodb中使用使用sort()方法對資料進行排序,sort()方法可以通過引數指定排序的欄位,並使用1和-1來指定排序的方式,其中1為升序排列,而-1是用於降序排列。
1 升序排列 -1 降序排列
db.集合名.find().sort({鍵值(屬性值):1})
把age集合表重新根據_id主鍵進行降序排列
db.age.find().sort({ "_id": -1 })
Node.js連線
安裝mongodb的模組
npm install mongodb
1.連線資料庫
var MongoClient = require('mongodb').MongoClient; //結尾是選擇資料庫名 var DB_CONN_STR = 'mongodb://localhost:27017/wscats'; MongoClient.connect(DB_CONN_STR, function(err, db) { console.log("連線成功!"); });
2.查詢資料
注意查詢回來的結果需要toArray來遍歷處理
var MongoClient = require('mongodb').MongoClient; var DB_CONN_STR = 'mongodb://localhost:27017/wscats'; MongoClient.connect(DB_CONN_STR, function(err, db) { console.log("連線成功!"); //選中age集合,並用find方法把結果集拿回來進行處理 db.collection("age").find({title: "cba"}).toArray(function(err, result) { if (err) { console.log('Error:' + err); return; } console.log(result); }); });
經過測試,讀取大於100條的時候會出現報錯官網解釋,可以嘗試用forEach代替
db.collection('pokemon').find({}) .forEach(function(item){ console.log(item) })
查詢ID
查詢自動生成的ObjectId
var ObjectId = require('mongodb').ObjectId; let _id = ObjectId("5bcae50ed1f2c2f5e4e1a76a"); db.collection('xxx').find({ "_id": _id }).forEach(function (item) { console.log(item) })
3.插入資料
insert函式第一個引數是需要插入的值(可以一個也可以多個),第二個引數是接受一個回撥函式,當值插入成功後回返回插入值得一些關鍵資訊,比如_id
var MongoClient = require('mongodb').MongoClient; var DB_CONN_STR = 'mongodb://localhost:27017/wscats'; MongoClient.connect(DB_CONN_STR, function(err, db) { console.log("連線成功!"); const db = client.db("demo"); db.collection("age").insert([ { title: "插入的值A" }, { title: "插入的值B" } ], function(err, result) { if (err) { console.log('Error:' + err); return; } console.log(result) }) });
4.更新資料
注意如果不加$set就是完全替換原來的那份(沒有設定的屬性值將會丟失),加上$set則只是更新對應的屬性值,其餘不做改變
var MongoClient = require('mongodb').MongoClient; var DB_CONN_STR = 'mongodb://localhost:27017/wscats'; MongoClient.connect(DB_CONN_STR, function(err, db) { console.log("連線成功!"); db.collection("age").update({ "_id": 1 }, { $set: { title: "你好,世界", skill: "js" } }, function(err, result) { if (err) { console.log('Error:' + err); return; } //console.log(result); }); });
5.刪除資料
var MongoClient = require('mongodb').MongoClient; var DB_CONN_STR = 'mongodb://localhost:27017/wscats'; MongoClient.connect(DB_CONN_STR, function(err, db) { console.log("連線成功!"); db.collection("age").remove({ "_id": 1 }, function(err, result) { if (err) { console.log('Error:' + err); return; } //console.log(result); //關閉資料庫 db.close(); }); });
6.關閉資料庫
db.close();
封裝自定義模組
新建mongo.js寫入以下程式碼,封裝自定義模組,方便其他路由複用,注意assert是node自帶的斷言模組,用於測試程式碼
參考
const MongoClient = require('mongodb').MongoClient; const assert = require('assert'); const url = 'mongodb://localhost:27017'; const dbName = 'shop'; function query(callback) { MongoClient.connect(url, function(err, client) { assert.equal(null, err); console.log("Connected successfully to server"); const db = client.db(dbName); callback(db); client.close(); }); } module.exports = { query }
在路由檔案中引入和使用
var mongo = require('./mongo.js') router.post('/addproduct', function(req, res, next) { mongo.query(function(db) { db.collection("product").insertMany([req.body], function(err, result) { console.log("Inserted 1 document into the collection"); res.send('respond with a resource'); }); }) });