使用MongoDB存儲數(shù)據(jù)

在 Ubuntu14.04 上安裝

Install MongoDB Community Edition

官方文檔

1. Import the public key used by the package management system.

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6

2. Create a list file for MongoDB.

echo "deb [ arch=amd64 ] http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list

3. Reload local package database.

sudo apt-get update

4. Install the MongoDB packages.

Install the latest stable version of MongoDB.

sudo apt-get install -y mongodb-org

使用

1. Start MongoDB.

sudo service mongod start

2. Verify that MongoDB has started successfully

Verify that the mongod process has started successfully by checking the contents of the log file at /var/log/mongodb/mongod.log for a line reading

[initandlisten] waiting for connections on port <port>

3. Stop MongoDB.

sudo service mongod stop

4. Restart MongoDB.

sudo service mongod restart

關(guān)閉 mongodb 的守護進程

mongod --shutdown

卸載

Uninstall MongoDB Community Edition

1. Stop MongoDB.

sudo service mongod stop

2. Remove Packages.

sudo apt-get purge mongodb-org*

3. Remove Data Drections.

sudo rm -r /var/log/mongodb
sudo rm -r /var/lib/mongodb

在 windows 上安裝

查看當前windows的版本

wmic os get caption

Caption
Microsoft Windows 10 專業(yè)版

wmic os get osarchitecture

OSArchitecture
64 位

下載 win-64 安裝包

安裝路徑

C:\myprogram\MongoDB\3.6

自定義腳本

mongo.bat
d:
cd C:\myprogram\MongoDB\3.6\bin
mongod.exe --dbpath "G:\mongodata\db"
mongo-cli.bat
d:
cd C:\myprogram\MongoDB\3.6\bin
mongo.exe

MongoDB操作總結(jié)

1 創(chuàng)建數(shù)據(jù)庫
use mydb//沒有就創(chuàng)建

2 顯示數(shù)據(jù)庫
show dbs

3 顯示數(shù)據(jù)庫的狀態(tài)
db.stats()

4 檢查當前所用的數(shù)據(jù)庫
db

5 刪除數(shù)據(jù)庫(先用然后刪除)
use mydb
db.dropDatabase()

6 在數(shù)據(jù)庫中創(chuàng)建集合(mycol為集合名稱)
    a.  db.createCollection('mycol')    //創(chuàng)建默認集合
    db.mycol.insert({id:1,name:'張三',age:20})
    db.mycol.find({})
    db.mycol.insert({_id:'aa',name:'李四',age:20})
    b.  db.createCollection("mycol",{capped:true,autoIndexID:true,size:6142800,max:10000}) //創(chuàng)建指定參數(shù)集合
    指定參數(shù):
    capped true 啟用封頂集合,固定大小的集合,會自動覆蓋最早的條目,如果true,也需要指定尺寸參數(shù)
    size number 指定最大字節(jié)封頂集合,如果封頂為true,需要指定這個字段
    max number  指定封頂集合最大數(shù)量,最高多少條記錄
    autoIndexID true 則_id字段自動創(chuàng)建索引,默認false,慎用false,因為會導致同步數(shù)據(jù)時負載很高,建議true

7 直接插入數(shù)據(jù)創(chuàng)建集合
db.teacher.insert({'draven':'node'})
//自動創(chuàng)建名為teacher的數(shù)據(jù)集,里面有一條鍵值對

8 顯示集合
show collections

9 刪除集合
db.mycol.drop()

10 刪除集合數(shù)據(jù)
db.mycol.remove({})

11 顯示表格記錄
db.mycol.find({})

數(shù)據(jù)類型和嵌套關(guān)聯(lián)

//多條插入
db.mycol.insert([{},{},{}])

//覆蓋保存,沒有則插入,有則覆蓋
db.user.save({})

//插入時間
db.test.insert({time:new Date()})
給mongodb插入日期的數(shù)據(jù)時發(fā)現(xiàn),日期時間相差8小時,原來存儲在mongodb中的時間UTC+0:00,而中國的時區(qū)是+8.00

取出時正確
db.test.find()[0].time.getHours()

//保證正確的插入方式
new Date(2017,7,28,21,45,30) //2017-7-28 21:45:30

用自定義函數(shù):
function getFormateDate(time){
    year = time.getFullYear();
    mon = time.getMonth()+1;
    date = time.getDate();
    hour = time.getHours();
    min = time.getMinutes();
    sec = time.getSeconds();
    newtime = year+'-'+mon+'-'+date+' '+hour+':'+min+':'+sec;
    return newtime;
}

getFormateDate(new Date())
getFormateDate(db.user.find()[4].creattime)

修改數(shù)據(jù)
db.user.update({email:'aa'},{$set:{pwd:'bb'}}) //只能改第一條
db.user.update({email:'aa'},{$set:{pwd:'bb'}},{multi:true}) //允許多條
$unset  刪除字段
db.user.update({email:'aa'},{$unset:{pwd:'bb'}}) //刪除pwd:'bb'字段
$inc    在原先基礎(chǔ)上加一個數(shù)
db.user.update({email:'aa'},{$inc:{money:15}},{multi:true}) //email為aa的,每人加15塊錢
$push
{$push:{field:value}}
把value追加到field里面去。field一定是數(shù)組類型才行,如果field不存在,會新增一個數(shù)組類型加進去
$pushAll
{$pushAll:{field:value_array}}
同$push,只是一次可以追加多個值到一個數(shù)組字段內(nèi)
$addToSet
{$addToSet:{field:value}}
增加一個值到數(shù)組內(nèi),而且只有當這個值不在數(shù)組內(nèi)才增加

刪除記錄(remove)
db.user.remove({email:'aa'})
db.user.remove({email:'aa'},1)  //只刪除一條
db.user.remove({})  //全部清空

update操作符刪除
$pop
刪除數(shù)組內(nèi)的一個值
刪除最后一個值 {$pop:{field:1}}
刪除第一個值  {$pop:{field:-1}}

$pull
{$pull:{field:value}}
從數(shù)組field內(nèi)刪除一個等于value的值

$pullAll
{$pullAll:{field:value_array}}
同$pull,可以一次刪除數(shù)組內(nèi)多個值
db.test.update({_id:5},{$pullAll:{test1:['ccc','ffff']}})

$ 操作符
代表安條件找出的數(shù)組里面某項它自己
需要注意的是,如果后面不跟{multi:true},$只會應用找到的第一條數(shù)據(jù)項,后面的就不管了

查詢數(shù)據(jù)
db.user.find()
db.user.find().pretty() //格式化,輸出格式比較公正好看一點
db.user.findOne() //只查詢碰到的第一條
db.user.find()[0] //只查詢碰到的第一條,更靈活點,可以查第幾條

db.mycol.count()    //查看有幾條記錄
db.mycol.count({age:20})    //age為20的有幾條數(shù)據(jù)
db.mycol.find({},{name:1,age:1})    //1為顯示,0為不顯示,查詢mycol所有記錄,只顯示name和age字段,但是此時_id是顯示的
db.mycol.find({},{name:1,age:1,_id:0})    //只顯示name和age,_id是不顯示的

db.mycol.find({'likes':{$lt:50}}).pretty()  //查出likes小于50的
<   $lt     小于
<=  $lte    小于等于
>   $gt     大于
>=  $gte    大于等于
!=  $ne     不等于
db.user.find({money:{$lt:80,$gt:20}})   //money大于20小于80

多條件查詢and
db.user.find({key1:value1,key2:value2}).pretty()    //如果兩個key一樣,后面的會覆蓋前面的
多條件查詢or
db.mycol.find({$or:[{key1:value1},{key2:value2}]}).pretty()
多條件查詢and和or一起用
db.mycol.find({'likes':{$gt:10},{$or:[key1:value1,key2:value2]}})

db.user.find({pwd:/li/}).pretty()   //查詢出pwd里面包含li的所有記錄,大小寫敏感
db.user.find({pwd:/li/i}).pretty()   //查詢出pwd里面包含li的所有記錄,忽略大小寫,主要針對英文的
db.user.find({'by':{$regex:/or.*/i}})   //包含or的,忽略大小寫
db.user.find({'by':/^tut/i})   //tut打頭的,忽略大小寫

分頁(limit)
db.COLLECTION_NAME.find().limit(NUMBER)
db.mycol.find().limit(3)
db.mycol.find({},{'title':1,_id:0}).limit(1).skip(3)    //跳到第三條記錄,向后顯示1條
db.mycol.find({},{'title':1,_id:0}).skip(3)    //跳到第三條記錄,向后顯示所有記錄

降序排序
db.mycol.find({},{title:1,_id:0}).sort({'title':-1})    //1用于升序排序,而-1用于降序

php查詢方法
$paramArr = array(
    "nicheng"=>new MongoRegex("/.*".$_POST["nicheng"].".*/")
)


聚合查詢
$match:匹配條件,可選,過濾條件
$limit:結(jié)果條數(shù),可選
$group:聚合規(guī)則
$sort:對查詢結(jié)果排序,-1表示降序

1 每個學生參考幾門
db.course.aggregate([{$group:{_id:"$uid",科目數(shù):{$sum:1}}},{$sort:{_id:-1}}])

2 每個學生的總成績
db.course.aggregate([{$group:{_id:{uid:'$uid',姓名:'$name'},參考門數(shù):{$sum:1},總成績:{$sum:'$score'}}},{$sort:{_id:1}}])

3 平均成績
db.course.aggregate([{$group:{_id:{uid:"$uid",姓名:"$name"},參考門數(shù):{$sum:1},總分:{$sum:'$score'},平均分:{$avg:'$score'}}},{$score:{_id:1}}])
查詢結(jié)果如下:
{"id":{uid:1,"姓名":"張三"},"參考門數(shù)":4,"總分":278,"平均分":69.5}
{"id":{uid:2,"姓名":"李四"},"參考門數(shù)":5,"總分":331,"平均分":66.2}
{"id":{uid:3,"姓名":"王五"},"參考門數(shù)":5,"總分":383,"平均分":76.6}

4 每個及格的學生的平均成績
{$match:{score:{$gte:60,$lt:90}}}
先過濾再統(tǒng)計
db.course.aggregate([{$match:{score:{$gte:60,$lt:90}}},{$group:{_id:{uid:"$uid",姓名:"$name"},參考門數(shù):{$sum:1},總分:{$sum:'$score'},平均分:{$avg:'$score'}}},{$score:{_id:1}}])

只顯示兩條
db.course.aggregate([{$match:{score:{$gte:60,$lt:90}}},{$group:{_id:{uid:"$uid",姓名:"$name"},參考門數(shù):{$sum:1},總分:{$sum:'$score'},平均分:{$avg:'$score'}}},{$score:{_id:1}},{$limit:2}])
跳過一條向下顯示兩條
db.course.aggregate([{$match:{score:{$gte:60,$lt:90}}},{$group:{_id:{uid:"$uid",姓名:"$name"},參考門數(shù):{$sum:1},總分:{$sum:'$score'},平均分:{$avg:'$score'}}},{$score:{_id:1}},{$skip:1},{$limit:2}])

參數(shù):
$sum 總結(jié)從集合中的所有文件所定義的值.
$avg 從所有文檔集合中所有給定值計算的平均.
$min 獲取集合中的所有文件中的相應值最小.
$max 獲取集合中的所有文件中的相應值的最大.
$push 值插入到一個數(shù)組生成文檔中. db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])
$addToSet 值插入到一個數(shù)組中所得到的文檔,但不會創(chuàng)建重復. db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])
$first 根據(jù)分組從源文檔中獲取的第一個文檔。通常情況下,這才有意義,連同以前的一些應用 “$sort”-stage. db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])
$last 根據(jù)分組從源文檔中獲取最后的文檔。通常,這才有意義,連同以前的一些應用 “$sort”-stage. db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])


創(chuàng)建索引
db.mycol.ensureIndex({"title":1})   //1是按升序排列
//mongodb會為我們?nèi)ヒ粋€默認的名字,規(guī)則為keyname1_dir1_keyname2_dir2...keynameN_dirN

查看我們創(chuàng)建的索引
db.system.indexes.find()

刪除索引
db.runCommand({"dropIndexes":"user","index":"IX_name"})

多字段索引
db.mycol.ensureIndex({"title":1,"description":1})

唯一索引
db.user.ensureIndex({"name":1},{unique:true})
db.user.ensureIndex({email:1},{unique:true,name:'email_uiq'})

聯(lián)合唯一索引
db.user.ensureIndex({uid:1,cid:1},{unique:true,name:"uid_cid_unique"})


存儲過程
保存為存儲過程:    
db.system.js.save({_id:存儲過程名稱,value:存儲過程體}) //添加一個新的存儲過程或者更新一個已經(jīng)存在的存儲過程    

db.system.js.insert({_id:'add',value:function(a,b){
    return a+b*2;
}})

db.system.js.save({_id:'add',value:function(a,b){
    return a+b;
}})

查看存儲過程
db.system.js.find()

db.eval("add(9,3)") //函數(shù)名,參數(shù)

WARNING:db.eval() is deprecated //這方法新版已經(jīng)棄用了

刪除存儲過程
db.system.js.remove({_id:'add'})

//--------------------臨時數(shù)據(jù)----------------------------
db.user.insert({name:'張三',birthday:new Date(1990,6,7)})
db.user.insert({name:'李四',birthday:new Date(1997,3,5)})
db.user.insert({name:'王五',birthday:new Date(1989,4,20)})
db.user.insert({name:'周六',birthday:new Date(1992,5,9)})
db.user.insert({name:'蔣七',birthday:new Date(1994,8,7)})

db.user.find()

存儲過程最高支持es5的寫法

//加載文件
load('g:/data/storepro.js')
db.system.js.find()
db.user.find()
//調(diào)用
getUserRS = db.eval('getUserRS')
getUserRS(db.user.find())

備份和恢復

一 備份數(shù)據(jù)庫
新建文件夾G:/mongodata/back
cd C:\myprogram\MongoDB\3.6\bin
mongodump -d mydb -o g:/mongodata/back

mongodump -h IP --port 端口 -u 用戶名 -p 密碼 -d 數(shù)據(jù)庫 -o 文件要存的路徑
如果沒有用戶,可以去掉-u和-p。
如果導出本機的數(shù)據(jù)庫,可以去掉-h。
如果是默認端口,可以去掉--port。
如果想導出所有數(shù)據(jù)庫,可以去掉-d。

導出所有數(shù)據(jù)庫(以下的是linux的路徑格式,windows環(huán)境類似)
命令:mongodump -h 127.0.0.1 -o /home/draven/mongodb/

導出指定數(shù)據(jù)庫
mongodump -h 192.168.1.108 -d tank -o /home/draven/mongodb/

二 mongorestore還原數(shù)據(jù)庫
1,常用命令格式
 mongorestore -h IP --port 端口 -u 用戶名 -p 密碼 -d 數(shù)據(jù)庫 --drop 文件存在路徑 
 --drop的意思是,先刪除所有的記錄,然后恢復。
  mongorestore /home/draven/mongodb/  #這里的路徑是所有庫的備份

C:\myprogram\MongoDB\3.6\bin>mongorestore -d mydb1 --dir g:/data/back/mydb

2,恢復所有數(shù)據(jù)庫到mongodb中
mongorestore /home/draven/mongodb/  #這里的路徑是所有庫的備份

3,還原指定的數(shù)據(jù)庫
C:\myprogram\MongoDB\3.6\bin>mongorestore -d mydb1 --dir g:/data/back/mydb
mydb1是新的數(shù)據(jù)庫名稱,mydb是備份目錄中的mydb的數(shù)據(jù)庫的文件夾

??不明白的
mongorestore -d tank /home/draven/mongodb/tank/  #tank這個數(shù)據(jù)庫的備份路徑
mongorestore -d tank_new /home/draven/mongodb/tank/  #將tank還有tank_new數(shù)據(jù)庫中

三 mongoexport導出表,或者表中部分字段
mongoexport -h IP --port 端口 -u 用戶名 -p 密碼 -d 數(shù)據(jù)庫 -c 表名 -f 字段 -q 條件導出 --csv -o 文件名 

上面的參數(shù)好理解,重點說一下:
-f    導出指字段,以字號分割,-f name,email,age導出name,email,age這三個字段
-q    可以根據(jù)查詢條件導出,-q '{ "uid" : "100" }' 導出uid為100的數(shù)據(jù)
--csv 表示導出的文件格式為csv的,這個比較有用,因為大部分的關(guān)系型數(shù)據(jù)庫都是支持csv,在這里有共同點

導出整張表
mongoexport -d tank -c users -o /home/zhangy/mongodb/tank/users.dat

根據(jù)條件導出數(shù)據(jù)
mongoexport -d tank -c users -q '{uid:{$gt:1}}' -o tank/users.json

四 mongoimport導入表,或者表中部分字段

還原整表導出的非csv文件
mongoimport -h IP --port 端口 -u 用戶名 -p 密碼 -d 數(shù)據(jù)庫 -c 表名 --upsert --drop 文件名  
重點說一下--upsert,其他參數(shù)上面的命令已有提到,--upsert 插入或者更新現(xiàn)有數(shù)據(jù)

還原部分字段的導出文件
mongoimport -h IP --port 端口 -u 用戶名 -p 密碼 -d 數(shù)據(jù)庫 -c 表名 --upsertFields 字段 --drop 文件名  
--upsertFields根--upsert一樣

還原導出的csv文件
mongoimport -h IP --port 端口 -u 用戶名 -p 密碼 -d 數(shù)據(jù)庫 -c 表名 --type 類型 --headerline --upsert --drop 文件名  

還原導出的表數(shù)據(jù)
mongoimport -d tank -c users --upsert tank/users.dat

部分字段的表數(shù)據(jù)導入
mongoimport -d tank -c users  --upsertFields uid,name,sex  tank/users.dat 

還原csv文件
mongoimport -d tank -c users --type csv --headerline --file tank/users.csv


應用
Express中操作mongodb
1.npm install mongodb --save-dev
2.打開dos窗口:啟動mongodb      
C:\myprogram\MongoDB\3.6\bin>mongod.exe --dbpath "G:\mongodata\db"
mongoose連接mongodb
Mongoose庫簡而言之就是在node環(huán)境中操作MongoDB數(shù)據(jù)庫的一種便捷的封裝,一種對象模型工具,增加里一些api,類似ORM
1.安裝      
npm install mongoose --save-dev      
2.mongoose.js
sails中操作mongodb
1.創(chuàng)建項目:  
G:\www\nodejs\sails>sails new blog  
G:\www\nodejs\sails\blog>npm install sails-mongo --save-dev
2.config/connections.js中
someMongodbServer: {
    adapter: 'sails-mongo',
        host: 'localhost',
            port: 27017,
                // user: 'username',  
                // password: 'password',  
                database: 'segment'
},  
  
3.config/models.js中
connection: 'someMongodbServer',
    migrate: 'safe'

4.models/User.js
module.exports = {
    tableName: 'user',
    adapter: 'sails-mongo',
    autoCreatedAt: false,
    autoUpdatedAt: false,
    attributes: {
        id: { columnName: '_id' }, email: {}, pwd: {}, nicheng: {}, updtime: {}, createtime: {},
    }
};

5.api/controllers/UserController.js
User = require('../models/User');
function formatDate(date) {
    return date.toLocaleDateString() + ' ' + date.toLocaleTimeString();
}
module.exports = {
    /**  
     * `UsersController.zhuce()`  
     */
    zhuce: function (req, res) {
        var user = { id: 2, email: 'cc', pwd: 'cc', nicheng: '王五' };
        user.createtime = formatDate(new Date());
        User.create(user).exec(function (err, created) {
            if (err) {
                var errStr = err.message;
                res.send(errStr);
                return;
            }
            res.send("注冊成功");
        })
    },
    login: function (req, res) {
        /*  
        User.find({email:'aa',pwd:'aa'},function(err,rs){  
            console.log(rs);  
            res.send('查到:'+rs);  
        });  
        */
        User.findOne({ email: 'aa', pwd: 'aa' }, function (err, rs) {
            console.log(rs);
            res.send('查到:' + rs);
        });
    }
};

6.啟動Mongodb服務  
C:\myprogram\MongoDB\3.6\bin> mongod.exe --dbpath "G:\mongodata\db"
  
7.啟動Mongodb管理器  
C:\myprogram\MongoDB\3.6\bin> mongo.exe

8.啟動sails: sails lift  
  
9.訪問: http://localhost:1337/user/zhuce
nodejs調(diào)用mongodb存儲過程

Node/Express/Mongoose 中的使用

已上傳至我的 Github 主頁: 參考源碼


想要查看更多文章,敬請關(guān)注 dravenxiaokai 的簡書

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 以 MongoDB Community Edition on Ubuntu 為例,參考MongoDB官網(wǎng) 安裝mo...
    HiFi不二閱讀 3,817評論 0 3
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,568評論 19 139
  • 畢業(yè)設計采用 Python 寫電影個性化推薦,于是切換到Linux,安裝了Ubuntu 16.04。 數(shù)據(jù)儲存選用...
    Leoshi閱讀 743評論 0 1
  • 一定要選擇自己愛的 一定要愛自己選擇的 紛亂浮華的塵世 唯能予你情比金堅 _______清凈獨覺
    清凈獨覺閱讀 307評論 0 24
  • 我只是不想再站在你身后 等待你轉(zhuǎn)身了 謝謝你啊
    精分的一只小猴子閱讀 346評論 0 0

友情鏈接更多精彩內(nèi)容