1. 程式人生 > >mongodb的基礎瞭解

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查詢的資料進行格式化 目的好看一點

 

 

ANDOR尋找

AND

find()方法中,如果通過使用將它們分開傳遞多個鍵,則mongodb將其視為AND條件。 以下是AND的基本語法

尋找_id1並且namewscats的所有結果集

db.age.find( { $and: [ {"_id": 1}, {"name": "wscats"} ] } )

OR

在要根據OR條件查詢文件,需要使用$or關鍵字。以下是OR條件的基本語法

尋找namecorrine或者namewscats的所有結果集

 

db.age.find( { $or: [ {"name": "corrine"}, {“name“: "wscats"} ] } )

 

ANDOR等結合

 

相當於語句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 順序無干系 都是先跳過後限制

 

LimitSkip方法

 

Limit

 

如果你需要在mongodb中讀取指定數量的資料記錄,可以使用mongodbLimit方法,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寫入以下程式碼,封裝自定義模組,方便其他路由複用,注意assertnode自帶的斷言模組,用於測試程式碼

 

參考

 

 

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'); }); }) });