選擇server => MongoDB Community Server(商業版) => 選擇64位的下載javascript
安裝一路回車,我這裏安裝到了C:\Program Files\MongoDB\Server\4.0\binhtml
配置環境變量前端
啓動服務端,啓動服務的命令的文件是:mongod.exejava
C:\Program Files\MongoDB
下新建一個db文件夾,win+R,輸入cmd,而後用cd命令進入C:\Program Files\MongoDB
:\bin目錄下,執行以下命令: C:\Program Files\MongoDB\bin>mongod.exe --dbpath C:\Program Files\MongoDB\db
將會輸出服務端相關信息,包括版本,數據庫所在路徑,監聽端口號,數據庫大小等等、看到這個說明你已經成功了,默認端口是27017node
查看存在數據庫命令:mongo show dbs
查看數據庫版本命令:mongo db.version()
複製代碼
若是有數聽說明安裝成功mysql
mongo shell 若是之前接觸過數據庫必定知道每一個數據庫都有本身獨特的命令,MSSQL和MYsql用的都是Sql命令,MongoDB的操做命令就是前端最熟悉的JavaScript命令web
操做前你須要打開Mongo服務器和連接到服務器-也就是咱們的mongod命令和mongo命令sql
var x='Hello World'
print(x)
複製代碼
這裏的輸出命令不是console.log,而是printmongodb
輸入函數,輸入一半時會有3個點表示沒輸完的語句能夠繼續輸shell
之前咱們的關係型數據庫的數據結構都是頂層是庫,庫下面是表,表下面是數據。可是MongoDB有所不一樣,庫下面是集合,集合下面是文件,能夠看下面這張圖進行了解一下。
mongoddb(非關係型數據庫) | mysql(關係型數據庫) |
---|---|
文件(document) | 行(row) |
集合(collections) | 表(table) |
數據庫(databases) | 數據庫(databases) |
eg 新建一個login.js文件
var userName = 'niuxiaoling'; // 聲明登陸名
var timeStamp = Date.parse(new Date()); //時間戳
var jsonDatebase = {
'loginName':userName,
"loginTime":timeStamp
}
var db = connect('log');//use log
db.login.insert(jsonDatebase); // login集合
print('log print success');
複製代碼
執行login.js 直接DOS中 mongo login.js
在操做數據庫時要注意: 第一個是快速存儲能力 第二個是迅速查詢能力
db.test.insert([
{"_id":1},
{"_id":2},
{"_id":3}
])
複製代碼
注意一次插入不要超過48M,向.zip和大圖片什麼的儘可能用靜態存儲,MongoDB存儲靜態路徑就好,這也算是一個規則。
循環插入數據
var startTime = (new Date()).getTime(); //獲得開始時間
var db = connect('log'); //連接數據庫
//開始循環
for(let i=0;i<1000;i++){
db.test.insert({num:i});
}
var runTime = (new Date()).getTime()-startTime;//計算時間差
print ('This run this is:'+runTime+'ms');//打印出來 507ms
複製代碼
批量插入數據
var startTime = (new Date()).getTime();
var db = connect('log');
var tempArray = [] //聲明一個數組
for(let i=0;i<1000;i++){ //循環向數組中放入值
tempArray.push({num:i});
}
db.test.insert(tempArray) //批量一次插入
var runTime = (new Date()).getTime()-startTime;
print ('This run this is:'+runTime+'ms'); // 17ms
複製代碼
修改數據的錯誤點 插入數據文件demo02.js
var db = connect('log')
var webwork = {
name: 'xiaoling',
age: 18,
sex: 0,
skill: {
skillOne: 'html',
skillTwo: 'javascript',
skillThree: 'node'
}
}
var webwork1 = {
name: 'list',
age: 18,
sex: 0,
skill: {
skillOne: 'html',
skillTwo: 'javascript',
skillThree: 'node'
}
}
var webwork2 = {
name: 'wangwu',
age: 18,
sex: 0,
skill: {
skillOne: 'html',
skillTwo: 'javascript',
skillThree: 'node'
}
}
var workmoney = [webwork, webwork1, webwork2]
db.workspace.insert(workmoney)
print('The data was inserted successfully.')
複製代碼
錯誤點:只update修改項
正確的:demo03.js能夠聲明一個變量,而後把要改變數據的所有信息放入變量,最後執行修改操做。
var db = connect('log')
var webwork2 = {
name: 'chenming',
age: 18,
sex: 0,
skill: {
skillOne: 'html',
skillTwo: 'javascript',
skillThree: 'node'
}
}
db.workspace.update({
name: 'xiaoling'
}, webwork2)
print('[update] the data was updated successfully')
複製代碼
須要刪除(db.workmate.drop())表中的數據,由於MinJie這個用戶已經不在數據庫中了,而後從新使用load方法載入插入數據再進行修改。而後執行 db.workmate.drop() load('./demo02.js') load('./demo03.js')
dbd .workmate.update({"name":"MinJie"},{"$set":{sex:2,age:21}})
複製代碼
db.workmate.update({"name":"MinJie"},{"$set":{"skill.skillThree":'word'}})
複製代碼
db.workmate.update({"name":"MinJie"},{$unset:{"age":''}})
複製代碼
db.workspace.update({name: 'list'}, {$inc: {age: -2}})
複製代碼
db.workspace.update({}, {$set: {birth: ''}}, {multi: true})
複製代碼
db.workspace.update({name: 'xiaoling'}, {age: 15, sex: 1}, {upsert: true})
複製代碼
我就是這麼一遍遍的測試的
// db.workspace.update({name: 'xiaoling'}, {$push: {interest: 'draw'}}) // 爲數組追加一條
複製代碼
db.workspace.update({name:'xiaoling',interest:{$ne:'computer'}},{$push:{interest:'computer'}}) // $ne 判斷是否存在,存在不執行,不存在執行
複製代碼
$addToSet 查找是否存在,不存在就push上去
$each 批量追加
var interestList = ['sleep','music','computer','code'];
db.workspace.update({name:'xiaoling'},{$addToSet:{interest:{$each:interestList}}})
複製代碼
$pop只刪除一次,並非刪除全部數組中的值。並且它有兩個選項,一個是1和-1。
1:從數組末端進行刪除
-1:從數組開端進行刪除
db.workspace.update({name:'xiaoling'},{$pop:{interest:-1}}) // $pop 刪除數組值,-1從開端刪除,1從末端刪除
複製代碼
數組定位修改
有時候只知道修改數組的第幾位,但並不知道是什麼,這時候咱們可使用interest.int 的形式。
db.workspace.update({name:'xiaoling'},{$set:{"interest.3":'work'}}) //根據數組的定位修改,interest.int
複製代碼
非應答式操做即:在操做完數據庫後,它給咱們任何的迴應和返回值
應答式寫入:就會給咱們直接返回結果(報表),結果裏邊的包含項會不少,這樣咱們就能夠很好的進行程序的控制和安全機制的處理。有點像前端調用後端接口,不管做什麼,後端都要給我一些狀態字同樣。
db.runCommand() 數據庫運行命令的執行器,執行命令首選就要使用它
db.listCommands() 查看全部的Commad命令
db.runCommand({ping:1}) 查看是否和數據庫鏈接成功
findAndModify 配置它能夠在修改後給咱們返回修改的結果
var myModify = {
findAndModify: 'workspace',
query: {age: 15},
update: {$set: {name: 'xiaoling'}},
new: true,
upsert: true
}
var resultMessage = db.runCommand(myModify)
printjson(resultMessage) // 輸出json
複製代碼
db.workspace.find(
{'skill.skillOne': 'html'},
{name: true, 'skill.skillTwo': 1, _id: 0}
) // 0 表明false,1表明true
複製代碼
db.workspace.find(
{age: {$lte: 30, $gte: 25}},
{name: true, age: true, 'skill.skillOne': true, _id: false}
)
複製代碼
db.workspace.find({age: {$in: [25, 30]}}, {_id: 0})
複製代碼
db.workspace.find(
{$or: [{age: {$gte: 30}}, {'skill.skillTwo': 'javascript'}]},
{_id: 0}
)
複製代碼
db.workspace.find(
{$and: [{age: {$gte: 30}}, {'skill.skillTwo': 'javascript'}]},
{_id: 0}
)
複製代碼
db.workspace.find({
age:{
$not:{
$lte:30,
$gte:20
}
}
},
{name:1,"skill.skillOne":1,age:1,_id:0}
)
複製代碼
db.workspace.find({interest:{$all:['看電影','看書']}})
複製代碼
db.workspace.find({interest:{$in:['看電影','旅遊']}})
複製代碼
db.workspace.find({interest:{$size:5}})
複製代碼
db.workspace.find({},{name:1,interest:{$slice:2},_id:0}) // 查找全部的數據,只展現興趣的前2條信息
複製代碼
實現分頁的demo,將limit和skip結合起來
db.workspace.find({},{name:true,age:true,_id:false}).limit(2).skip(0).sort({age:1});
複製代碼
db.workspace.find({$where:'this.age>30'},{name:true,age:true,_id:false}) // where查詢,this指的是workspace集合
複製代碼
遊標
var db = connect('log') // 連接集合log
var result = db.workspace.find({interest: {$size: 5}}) //查詢 聲明result,把查詢結果賦值給result
//利用遊標的hasNext()進行循環輸出結果。
// while (result.hasNext()) {
// printjson(result.next())
// }
或者利用foreach
result.forEach(function(result){
printjson(result)
})
複製代碼
db.集合.getIndexes() 查看索引
db.集合.ensureIndex({username:1}) 建議索引
什麼狀況不須要使用索引?
加入如今再創建一個索引,查詢的時候就是複合索引查詢, MongoDB的複合查詢是按照咱們的索引順序進行查詢
var rs = db.test
.find({username: 'p3octakdxkn1u', randNum0: 169770})
.hint({randNum0: 1, username: 2}) // MongoDB的複合查詢是按照咱們的索引順序進行查詢,用咱們本身指定的索引優先查詢,這個方法就是hint()
複製代碼
db.集合.dropIndex('username_1') // 索引的惟一Id,索引的惟一id不是咱們的字段名稱而是索引查詢表中的name
var db = connect('log')
// db.info.insert({
// contextInfo:
// 'I am a programmer, I love life, love family. Every day after work, I write a diary.'
// })
// db.info.insert({
// contextInfo:
// 'I am a programmer, I love PlayGame, love drink. Every day after work, I playGame and drink.'
// })
var rs = db.info.find({$text: {$search: 'PlayGame'}})
rs.forEach(rs => printjson(rs))
複製代碼
// var rs = db.info.find({$text: {$search: 'programmer family diary drink'}}) // 查找多個詞
複製代碼
var rs = db.info.find({$text: {$search: 'programmer family diary -drink'}}) // 不但願找到的
複製代碼
var rs = db.info.find({$text: {$search: '"love PlayGame" drink'}}) // 轉義
複製代碼
只是操做客戶端的界面,服務端仍是要開啓的
感謝技術胖的分享視頻:技術胖的博客