安裝配置
在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則只是更新對應的屬性值,其餘不做改變
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對象