MongoDB--當前最流行的非關係型數據庫的安裝與使用

安裝配置

在Mongodb官網下載最新版本的Mongodb下載地址
下載msi的window安裝包,可以裝到C盤或者D盤目錄下

配置:

由於我是安裝在D盤的環境下
D:\Program Files (x86)\MongoDB\Server\3.2\bin
所以在bin文件夾下找到mongod.exe命令,然後通過管理員執行mongod --dbpath x路徑x,路徑可以是任何地方,我這裏選擇在D盤的MongoDB目錄下,當然路徑不要包含特殊的字符串,比如Program Files (x86)也不行

mongod --dbpath D:\mongodb\data\db

命令行

經過上面的配置之後,就可以返回bin目錄下找到mongo.exe命令,並管理員下執行,就可以出現mongodb的命令行模式
D:\Program Files (x86)\MongoDB\Server\3.2\bin

然後就可以使用下面的命令來測試了

mongod
db.help()//幫助
db.stats()//統計

顯示數據庫
show dbs

檢查當前選擇的數據庫
db

添加數據庫

數據庫名爲數據庫創建的名字,使用該命令後會默認切換到對應的數據庫,並且在數據庫中添加選項,數據庫信息才顯示,如果默認就有該數據庫,那就是切換到對應的數據庫裏面
use 數據庫名

刪除數據庫

先切換到對應的數據庫,然後再執行db.dropDatabase()刪除該數據庫
use 數據庫名
//switched to db 數據庫名
db.dropDatabase()

顯示集合

用一下命令可以檢查創建的集合
show collections

添加集合

在創建完數據庫之後,我們就可以創建集合
db.createCollection(集合名字name,設置參數options[對象類型])

name是要創建的集合的名稱。 options是一個文檔,用於指定集合的配置
參數 類型 描述
name String 要創建的集合的名稱
options Document (可選)指定有關內存大小和索引的選項
options參數是可選的,因此只需要指定集合的名稱。 以下是可以使用的選項列表:
字段 類型 描述
capped Boolean (可選)如果爲true,則啓用封閉的集合。上限集合是固定大小的集合,它在達到其最大大小時自動覆蓋其最舊的條目。 如果指定true,則還需要指定size參數。
autoIndexId Boolean (可選)如果爲true,則在_id字段上自動創建索引。默認值爲false。
size 數字 (可選)指定上限集合的最大大小(以字節爲單位)。 如果capped爲true,那麼還需要指定此字段的值。
max 數字 (可選)指定上限集合中允許的最大文檔數。
由於option是可選,我們也可以不帶配置項創建集合
db.createCollection(“mycollection”)

刪除集合

db.collection.drop()用於從數據庫中刪除集合
db.集合名.drop()

比如我們可以測試以下操作
db.createCollection(“wscats”)//創建名爲wscats的集合
show collections//顯示該數據庫所有集合 wscats
db.wscats.drop()//刪除名爲wscats的集合

查看文檔

最簡單查看文檔的方法就是find(),會檢索集合中所有的文檔結果
db.集合名.find()

要以格式化的方式顯示結果,可以使用pretty()方法。
db.集合名.find().pretty()

1.固值尋找

尋找age集合裏面所有含有屬性值爲wscats的文檔結果,相當於where name = ‘wscats’
db.age.find({name:“wscats”})

2.範值尋找

操作 語法 示例 等效語句
相等 {:} db.age.find({“name”:“wscats”}).pretty() where name = ‘wscats’
小於 {:{KaTeX parse error: Expected 'EOF', got '}' at position 4: lt:}̲} db.age.find({…lt:50}}).pretty() where likes < 50
小於等於 {:{KaTeX parse error: Expected 'EOF', got '}' at position 5: lte:}̲} db.age.find({…lte:50}}).pretty() where likes <= 50
大於 {:{KaTeX parse error: Expected 'EOF', got '}' at position 4: gt:}̲} db.age.find({…gt:50}}).pretty() where likes > 50
大於等於 {:{KaTeX parse error: Expected 'EOF', got '}' at position 5: gte:}̲} db.age.find({…gte:50}}).pretty() where likes >= 50
不等於 {:{KaTeX parse error: Expected 'EOF', got '}' at position 4: ne:}̲} db.age.find({…ne:50}}).pretty() where likes != 50

3.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
}
}]
}]
})

插入文檔

文檔的數據結構和JSON基本一樣。
所有存儲在集合中的數據都是BSON格式。
BSON是一種類json的一種二進制形式的存儲格式,簡稱Binary JSON。
要將數據插入到mongodb集合中,需要使用mongodb的insert()或save()方法。
db.集合名.insert(document)

比如我們可以插入以下數據
db.wscats.insert({
_id: 100,
title: ‘MongoDB Tutorials’,
description: ‘node_tutorials’,
by: ‘Oaoafly’,
url: ‘https://github.com/Wscats/node-tutorial’,
tags: [‘wscat’,‘MongoDB’, ‘database’, ‘NoSQL’,‘node’],
num: 100,
})

也可以支持插入多個,注意傳入的是數組形式
db.wscats.insert([{
_id: 100,
title: ‘Hello’
},{
_id: 101,
title: ‘World’
}])

在插入的文檔中,如果不指定id參數,那麼mongodb會爲此文檔分配一個唯一的ObjectId
要插入文檔,也可以使用db.post.save(document)。如果不在文檔中指定id,那麼save()方法將與insert()方法一樣自動分配ID的值。如果指定id,則將以save()方法的形式替換包含id的文檔的全部數據。
db.wscats.save({
_id: 111,
title: ‘Oaoafly Wscats’,
})

更新文檔

尋找第一條title爲wscats的值,並且更新值title爲corrine和age爲12
db.age.update({
‘title’: ‘wscats’
}, {
$set: {
‘title’: ‘corrine’,
‘age’: 12
}
})

默認情況下,mongodb只會更新一個文檔。要更新多個文檔,需要將參數multi設置爲true,還可以配合find方法裏面的各種複雜條件判斷來篩選結果,然後更新多個文檔
尋找所有title爲wscats的值,並且更新值title爲corrine和age爲12

2.save()方法

將_id主鍵爲3的文檔,覆蓋新的值,注意_id爲必傳
db.age.save({
‘_id’:3,
‘title’: ‘wscats’
})

刪除文檔

刪除主鍵_id爲3的文檔,默認是刪除多條
db.age.remove({
‘_id’:3
})

建議在執行remove()函數前先執行find()命令來判斷執行的條件是否正確
如果你只想刪除第一條找到的記錄可以設置justOne爲1,如下所示
db.age.remove({…},1)

全部刪除
db.age.remove({})

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來決定顯示第幾頁(一個有規律變動的值)

排序

在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就是完全替換原來的那份(沒有設置的屬性值將會丟失),加上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自帶的斷言模塊,用於測試代碼

參考
官網API文檔
Node.js的斷言模塊assert進行單元測試
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’);
});
})
});

mongoose

下載mongoose
npm install mongoose --save

連接數據庫
var mongoose = require(‘mongoose’);
mongoose.connect(‘mongodb://localhost:27017/1823’);
var db = mongoose.connection;// 獲取連接對象進行監聽
db.on(‘error’,(err)=>{
console.log(‘連接錯誤’)
});
db.on(‘open’, function() {
console.log(‘連接ok’)
});

創建schema對象
var UserSchema = new mongoose.Schema({
name: String,
pass: String,
test:String
});

將schema轉化爲數據模型
let user = mongoose.model(‘user’, UserSchema); //參數1 是集合的名字 與數據模型關聯的schema對象

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章