前言:你們這些不好好寫接口的後臺,非要逼着前端一統天下。純屬開玩笑哈,第一次寫跟後臺相關的東西,當揭開後臺神祕的面紗的時候,那種驚喜、開心、成就感讓我重回當初寫出第一個hello world的時候。
由於我是用的是win10系統就以windows爲基礎說啊,linux和mac os的自行解決哈,不過應該也是大同小異的。
1. 安裝
mongodb的下載和安裝就不說了啊,還沒有下載安裝的自行去Mongodb 官網下載安裝即可。
2.創建data
這部分內容主要參考 NodeJS+Express+MongoDB 的文章,我主要說一下踩到的坑和遇到的錯誤處理
安裝好之後,在根目錄下創建data文件夾,我是放在e盤裏的。
e:\data\db用於存放mongodb的數據文件
e:\data\log用於存放mongodb的日誌文件
錯誤處理
1. 使用net start mongodb命令啓動MongoDB服務發生系統錯誤,返回值爲5
解決方法:cmd使用管理員身份打開即可,到C:\Windows\System32找到cmd.exe然後以管理員的身份運行。爲了避免每次啓 動都要查找一次cmd文件,我把cmd放在了開始菜單裏,右鍵固定在開始菜單就好了。
2. 使用net start mongodb命令啓動mongodb系統出錯。 發生系統錯誤 1067。 進程意外終止。
解決方法:MongoDB安裝目錄\data\將此文件夾下的mongod.lock刪除,我沒有遇到這個問題,也不知道能不能正確解決,有踩過坑的可以說一下。
3. 使用net stop mongodb命令啓動mongodb系統出錯。 發生系統錯誤 1067。 進程意外終止。
我在start的時候是正常啓動的,但是在stop的時候報錯了,但是最後還是正常stop了,上面所說的mongod.lock或者mongod.cfg我都沒有,也不知道如何解決,知道怎麼解決的大佬還請賜教,謝謝,鞠躬鞠躬!
注:解決了之後一定要重啓服務纔會生效哦。
3.啓動
還是繼續參考上一邊文章
1.命令行
## 開始服務
net start mongodb
## 停止服務 nginxstop並不會關閉服務,需要使用kill,事實證明win10下stop是可以正常停止服務的
net stop mongodb
2.在mongodb的安裝目錄下,E:\Program Files\MongoDB\Server\3.4\bin 下的mongo.exe文件 ,也可以放在開始裏面,右鍵固定在開始菜單就好了
3.可視化工具robomongo
下載傳送門 選擇 Robo 3T 即可,選擇第二個綠色版本即可,下載下來解壓直接運行.exe文件就可以了,當然了這個也可以放在開始,右鍵固定在開始菜單就好了。
4.管理員
參考 NodeJS入門——準備工作(2)——MongoDB安裝以及客戶端Robomongo安裝和使用
1.重新打開一個命令行窗口,切換到Mongodb安裝路徑下bin文件夾內
2.輸入命令: mongo,輸入命令 use admin切換到admin數據庫
3.輸入命令 db.addUser('admin','admin') 添加管理員賬戶 這是以前的版本
新版本應使用 ad.createUser({user:"admin",pwd:"admin",roles:[]})
新版本的命令參考
5.數據庫操作
使用robo3T robomongo工具
1.創建和刪除數據庫
可以使用圖形界面右鍵create database創建數據庫,右鍵Drop Database刪除數據庫
也可以使用命令行來操作:
1.創建數據庫gomall: use gomall
db
2.刪除數據庫gomall:use gomall
db.dropDatabase()
2.數據庫操作命令:
先打開shell腳本編寫界面
1.insert:
命令:db.表名.insert(數據);
例子:db.products.insert({name:"iphone",price:1988});
說明:insert操作會自動創建products表,_id,是mongodb自已生成的,每行數據都會存在,默認是ObjectId,可以在插入數據時插入這個鍵的值(支持mongodb支持的所有數據類型)
查看數據:db.getCollection('products').find({});
3.2 版本後還有以下幾種語法可用於插入文檔:
db.collection.insertOne():向指定集合中插入一條文檔數據
db.collection.insertMany():向指定集合中插入多條文檔數據
2.save
命令:db.表名.save.(數據);
例子:db.proctus.save({_id:2,name:"HuaWei P10",price:2999});
說明:_id可以自已插入、一個表中不一定要字段都相同,雖然insert和save方法都可以插入數據,當默認的“_id”值已存在時,調用insert方法插入會報錯;而save方法不會,會更新相同的_id所在行數據的信息。
3.批量添加
for(var i = 0; i < 5; i ++) db.users.save({'_id':i,'name':'zhangguo'+i,'age':i+8});
for(let i = 0; i < 5; i ++) db.users.save({'_id':i,'name':`zhangguo${i}`,'age':i+8});
4.查詢數據
1.查詢集合中所有數據
命令: db.集合.find();
例子:db.users.find({name:'zhangguo0'});
db.getCollection('users').find({});
db.users.find({});
db.users.find();
其中,例子的後面三種寫法是相同的結果
2.按條件查詢(支持多條件)
命令:db.集合.find(條件);
例子:db.users.find({name:'zhangguo0',age:9})
說明:對象中的條件要求同時成立
3.查詢第一條(支持條件)
命令:db.集合.findOne(條件);
例子:db.users.findOne({name:'zhangguo0'});
4.限制數量
命令: db.集合.find().limit(數量);
例子: db.users.find({}).limit(3); 或 db.users.find().limit(3); 結果一樣
5.跳過指定數量
命令: db.表名.find().skip(數量);
例子: db.users.find({}).skip(3);
db.users.find({}).skip(2).limit(2);
6.比較查詢
不同類型不會作比較,string和number不會作比較
比較查詢的語法參考
1.等於:$eq
格式:{<key>:<value>}
{<key>:{$eq:<value>}}
例子:db.users.find({age:10});
db.users.find({age:{$eq:10}});
說明:這兩種格式的結果是一樣的
2.大於: $gt
格式:{<key>:{$gt:<value>}}
例子:db.users.find({age:{$gt:10}});
3.大於等於: $gte
格式:{<key>:{$gte:<value>}}
例子:db.users.find({age:{$gte:10}});
4.小於: $lt
格式:{<key>:{$lt:<value>}}
例子:db.users.find({age:{$lt:10}});
5.小於等於: $lte
格式:{<key>:{$lte:<value>}}
例子:db.users.find({age:{$lte:10}});
6.不等於: $ne
格式:{<key>:{$ne:<value>}}
例子:db.users.find({age:{$ne:10}});
7.查詢數量
語法:db.表名.find().count();
例子:db.users.find({}).count()
8.排序
語法:db.表名.find().sort({"字段名":1});
例子:db.users.find({}).sort({}) 不能寫成db.users.find({}).sort()會報錯 "Failed to parse: sort: undefined. 'sort' field must be of BSON type object."
db.users.find({}).sort({age:-1,name:1});
說明:1:表示升序;-1:表示降序;db.users.find({}).sort({}) 什麼都不傳按默認排序,默認是_id升序排序
9.指定字段返回
語法:db.表名.find({},{"字段名":0});
例子:db.users.find({age:{$gt:9}},{_id:0,age:1,name:1});
說明: 參數 1:返回 0:不返回
5.修改
1.修改符合條件的第一條:update
語法:db.集合.update({"條件字段名":"字段值"},{$set:{"要修改的字段名":"修改後的字段值"}});
例子:db.users.update({age:{$eq:9}},{$set:{age:100}});
db.users.update({age:9},{$set:{age:100}});
說明:這兩種格式的例子結果是一樣的。前面save在_id字段已存在是就是修改操作。
2.修改多條:updateMany
例子: db.users.updateMany({age:{$gt:10}},{$set:{age:20}});
6.刪除
語法:db.集合.remove(條件);
例子:db.users.remove({age:{$gte:10}}); // 刪除年齡>=10歲的數據
6.node.js訪問Mongodb
前提:先用nodejs新建一個簡單的項目
在當前項目中引入mongodb,可以不用全局安裝的。
npm install mongodb --save
在項目的根目錄下新建一個db.js文件,使用Node.js操作MongoDB。寫完之後運行 node db.js 即可。
下面附上Node.js操作MongoDB的完整代碼。主要主義的點是2.x和3.0以上的版本api接口有一點出入
// 引入客戶端mongodb模塊,獲得客戶端對象
const MongoClient = require('mongodb').MongoClient;
// 連接字符串
const DB_CONN_STR = 'mongodb://localhost:27017/gomall';
// 添加數據
const insertData = function (db, callback) {
// 獲得指定的集合
let collection = db.collection('users');
// 插入數據
let data = [{
_id: 9,
name: 'rose',
age: 23
}, {
_id: 10,
name: 'mark',
age: 24
}];
// collection.insert(data, function (err, result) { // mongodb 2.x的寫法
collection.insertMany(data, function (err, result) {
// 如果存在錯誤
if (err) {
console.error('Error:', err);
return;
}
// 調用傳入的回調方法,將操作結果返回
callback(result);
});
}
// 修改數據
const updateData = function (db, callback) {
// 獲得指定的集合
let collection = db.collection('users');
// 要修改數據的條件,>=10歲的用戶
let where = {
age: {
$gte: 10
}
};
// 要修改的結果
let set = {
$set: {
age: 95
}
};
collection.updateMany(where, set, function (err, result) {
// 如果存在錯誤
if (err) {
console.error('Error:', err);
return;
}
// 調用傳入的回調方法,將操作結果返回
callback(result);
})
}
// 查詢數據
const findData = function (db, callback) {
let collection = db.collection('users');
let where = {
age: {
$eq: '22'
}
};
let set = {
name: 1,
age: 1
};
collection.find(where, set).toArray(function (err, result) {
if (err) {
console.error('Error:', err);
return;
}
callback(result);
});
// 刪除數據
const deleteData = function (db, callback) {
let collection = db.collection('users');
let where = {
age: {
$eq: '21'
}
};
collection.remove(where, function (err, result) {
if (err) {
console.error('Error:', err);
return;
}
console.log(result);
callback(result);
})
}
}
//使用客戶端連接數據,並指定完成時的回調方法
// MongoClient.connect(DB_CONN_STR, function (err, db) { // 2.x的寫法
MongoClient.connect(DB_CONN_STR, {
useNewUrlParser: true
}, function (err, client) { //// 3.0的寫法
if (err) {
console.error('數據庫連接失敗');
return;
}
console.log('連接成功');
// 執行插入數據操作,調用自定義方法
let db = client.db('gomall'); // 3.0的寫法
insertData(db, function (result) {
// 顯示結果
console.log(result);
// 關閉數據庫
client.close();
});
updateData(db, function (result) {
// 顯示結果
console.log(result);
client.close();
});
findData(db, function (result) {
console.log(result);
client.close();
});
deleteData(db, function (result) {
console.log(result);
client.close();
})
});
感謝:
1. https://www.cnblogs.com/best/p/6212807.html
2.https://www.cnblogs.com/zhaord/p/4229001.html
3.https://blog.csdn.net/u010523770/article/details/54599548
4.http://www.runoob.com/mongodb/mongodb-query.html
是你們在我黑暗的路上打開了一盞路燈,謝謝!
以上就是我的踩坑記錄,願對你也有所幫助。
願聖光與你同在