使用MongoDB存储数据

作者: dravenxiaokai | 来源:发表于2017-10-23 12:42 被阅读0次

在 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

关闭 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 专业版

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操作总结

1 创建数据库
use mydb//没有就创建

2 显示数据库
show dbs

3 显示数据库的状态
db.stats()

4 检查当前所用的数据库
db

5 删除数据库(先用然后删除)
use mydb
db.dropDatabase()

6 在数据库中创建集合(mycol为集合名称)
    a.  db.createCollection('mycol')    //创建默认集合
    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}) //创建指定参数集合
    指定参数:
    capped true 启用封顶集合,固定大小的集合,会自动覆盖最早的条目,如果true,也需要指定尺寸参数
    size number 指定最大字节封顶集合,如果封顶为true,需要指定这个字段
    max number  指定封顶集合最大数量,最高多少条记录
    autoIndexID true 则_id字段自动创建索引,默认false,慎用false,因为会导致同步数据时负载很高,建议true

7 直接插入数据创建集合
db.teacher.insert({'draven':'node'})
//自动创建名为teacher的数据集,里面有一条键值对

8 显示集合
show collections

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

10 删除集合数据
db.mycol.remove({})

11 显示表格记录
db.mycol.find({})

数据类型和嵌套关联

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

//覆盖保存,没有则插入,有则覆盖
db.user.save({})

//插入时间
db.test.insert({time:new Date()})
给mongodb插入日期的数据时发现,日期时间相差8小时,原来存储在mongodb中的时间UTC+0:00,而中国的时区是+8.00

取出时正确
db.test.find()[0].time.getHours()

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

用自定义函数:
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)

修改数据
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    在原先基础上加一个数
db.user.update({email:'aa'},{$inc:{money:15}},{multi:true}) //email为aa的,每人加15块钱
$push
{$push:{field:value}}
把value追加到field里面去。field一定是数组类型才行,如果field不存在,会新增一个数组类型加进去
$pushAll
{$pushAll:{field:value_array}}
同$push,只是一次可以追加多个值到一个数组字段内
$addToSet
{$addToSet:{field:value}}
增加一个值到数组内,而且只有当这个值不在数组内才增加

删除记录(remove)
db.user.remove({email:'aa'})
db.user.remove({email:'aa'},1)  //只删除一条
db.user.remove({})  //全部清空

update操作符删除
$pop
删除数组内的一个值
删除最后一个值 {$pop:{field:1}}
删除第一个值  {$pop:{field:-1}}

$pull
{$pull:{field:value}}
从数组field内删除一个等于value的值

$pullAll
{$pullAll:{field:value_array}}
同$pull,可以一次删除数组内多个值
db.test.update({_id:5},{$pullAll:{test1:['ccc','ffff']}})

$ 操作符
代表安条件找出的数组里面某项它自己
需要注意的是,如果后面不跟{multi:true},$只会应用找到的第一条数据项,后面的就不管了

查询数据
db.user.find()
db.user.find().pretty() //格式化,输出格式比较公正好看一点
db.user.findOne() //只查询碰到的第一条
db.user.find()[0] //只查询碰到的第一条,更灵活点,可以查第几条

db.mycol.count()    //查看有几条记录
db.mycol.count({age:20})    //age为20的有几条数据
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:结果条数,可选
$group:聚合规则
$sort:对查询结果排序,-1表示降序

1 每个学生参考几门
db.course.aggregate([{$group:{_id:"$uid",科目数:{$sum:1}}},{$sort:{_id:-1}}])

2 每个学生的总成绩
db.course.aggregate([{$group:{_id:{uid:'$uid',姓名:'$name'},参考门数:{$sum:1},总成绩:{$sum:'$score'}}},{$sort:{_id:1}}])

3 平均成绩
db.course.aggregate([{$group:{_id:{uid:"$uid",姓名:"$name"},参考门数:{$sum:1},总分:{$sum:'$score'},平均分:{$avg:'$score'}}},{$score:{_id:1}}])
查询结果如下:
{"id":{uid:1,"姓名":"张三"},"参考门数":4,"总分":278,"平均分":69.5}
{"id":{uid:2,"姓名":"李四"},"参考门数":5,"总分":331,"平均分":66.2}
{"id":{uid:3,"姓名":"王五"},"参考门数":5,"总分":383,"平均分":76.6}

4 每个及格的学生的平均成绩
{$match:{score:{$gte:60,$lt:90}}}
先过滤再统计
db.course.aggregate([{$match:{score:{$gte:60,$lt:90}}},{$group:{_id:{uid:"$uid",姓名:"$name"},参考门数:{$sum:1},总分:{$sum:'$score'},平均分:{$avg:'$score'}}},{$score:{_id:1}}])

只显示两条
db.course.aggregate([{$match:{score:{$gte:60,$lt:90}}},{$group:{_id:{uid:"$uid",姓名:"$name"},参考门数:{$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"},参考门数:{$sum:1},总分:{$sum:'$score'},平均分:{$avg:'$score'}}},{$score:{_id:1}},{$skip:1},{$limit:2}])

参数:
$sum 总结从集合中的所有文件所定义的值.
$avg 从所有文档集合中所有给定值计算的平均.
$min 获取集合中的所有文件中的相应值最小.
$max 获取集合中的所有文件中的相应值的最大.
$push 值插入到一个数组生成文档中. db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])
$addToSet 值插入到一个数组中所得到的文档,但不会创建重复. db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])
$first 根据分组从源文档中获取的第一个文档。通常情况下,这才有意义,连同以前的一些应用 “$sort”-stage. db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])
$last 根据分组从源文档中获取最后的文档。通常,这才有意义,连同以前的一些应用 “$sort”-stage. db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])


创建索引
db.mycol.ensureIndex({"title":1})   //1是按升序排列
//mongodb会为我们去一个默认的名字,规则为keyname1_dir1_keyname2_dir2...keynameN_dirN

查看我们创建的索引
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'})

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


存储过程
保存为存储过程:    
db.system.js.save({_id:存储过程名称,value:存储过程体}) //添加一个新的存储过程或者更新一个已经存在的存储过程    

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)") //函数名,参数

WARNING:db.eval() is deprecated //这方法新版已经弃用了

删除存储过程
db.system.js.remove({_id:'add'})

//--------------------临时数据----------------------------
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()
//调用
getUserRS = db.eval('getUserRS')
getUserRS(db.user.find())

备份和恢复

一 备份数据库
新建文件夹G:/mongodata/back
cd C:\myprogram\MongoDB\3.6\bin
mongodump -d mydb -o g:/mongodata/back

mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -o 文件要存的路径
如果没有用户,可以去掉-u和-p。
如果导出本机的数据库,可以去掉-h。
如果是默认端口,可以去掉--port。
如果想导出所有数据库,可以去掉-d。

导出所有数据库(以下的是linux的路径格式,windows环境类似)
命令:mongodump -h 127.0.0.1 -o /home/draven/mongodb/

导出指定数据库
mongodump -h 192.168.1.108 -d tank -o /home/draven/mongodb/

二 mongorestore还原数据库
1,常用命令格式
 mongorestore -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 --drop 文件存在路径 
 --drop的意思是,先删除所有的记录,然后恢复。
  mongorestore /home/draven/mongodb/  #这里的路径是所有库的备份

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

2,恢复所有数据库到mongodb中
mongorestore /home/draven/mongodb/  #这里的路径是所有库的备份

3,还原指定的数据库
C:\myprogram\MongoDB\3.6\bin>mongorestore -d mydb1 --dir g:/data/back/mydb
mydb1是新的数据库名称,mydb是备份目录中的mydb的数据库的文件夹

??不明白的
mongorestore -d tank /home/draven/mongodb/tank/  #tank这个数据库的备份路径
mongorestore -d tank_new /home/draven/mongodb/tank/  #将tank还有tank_new数据库中

三 mongoexport导出表,或者表中部分字段
mongoexport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 -f 字段 -q 条件导出 --csv -o 文件名 

上面的参数好理解,重点说一下:
-f    导出指字段,以字号分割,-f name,email,age导出name,email,age这三个字段
-q    可以根据查询条件导出,-q '{ "uid" : "100" }' 导出uid为100的数据
--csv 表示导出的文件格式为csv的,这个比较有用,因为大部分的关系型数据库都是支持csv,在这里有共同点

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

根据条件导出数据
mongoexport -d tank -c users -q '{uid:{$gt:1}}' -o tank/users.json

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

还原整表导出的非csv文件
mongoimport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 --upsert --drop 文件名  
重点说一下--upsert,其他参数上面的命令已有提到,--upsert 插入或者更新现有数据

还原部分字段的导出文件
mongoimport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 --upsertFields 字段 --drop 文件名  
--upsertFields根--upsert一样

还原导出的csv文件
mongoimport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 --type 类型 --headerline --upsert --drop 文件名  

还原导出的表数据
mongoimport -d tank -c users --upsert tank/users.dat

部分字段的表数据导入
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环境中操作MongoDB数据库的一种便捷的封装,一种对象模型工具,增加里一些api,类似ORM
1.安装      
npm install mongoose --save-dev      
2.mongoose.js
sails中操作mongodb
1.创建项目:  
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调用mongodb存储过程

Node/Express/Mongoose 中的使用

已上传至我的 Github 主页: 参考源码


想要查看更多文章,敬请关注 dravenxiaokai 的简书

相关文章

  • Python 轻松搭建Tcp服务

    代码100%可以运行,使用MongoDB数据库进行数据存储

  • 使用MongoDB存储数据

    在 Ubuntu14.04 上安装 Install MongoDB Community Edition 官方文档 ...

  • MongoDB 权限认证

    MongoDB 权限认证 MongoDB已经使用很长一段时间了,基于MongoDB的数据存储也一直没有使用到权限访...

  • 深入学习MongoDB

    分为两部分: 一、MongoDB拓展技术 。MongoDB集群,指导用户设置和使用集群存储大量数据并高效访问数据,...

  • Node使用 MongoDB

    最近项目中需要使用MongoDB做数据存储,从安装到简单使用做下记录 Mac安装MongoDB Mac上使用 br...

  • MongoDB

    MongoDB简介 MongoDB 是一个基于分布式文件存储的数据库。 MongoDB存储模式 数据库存储集合,集...

  • 我的物联网综合知识之创建数据库

    一、MongoDB简介 我们使用MongoDB数据库来存储数据。它是一个面向文档的非关系型(NoSQL)数据库,基...

  • MongoDB地理数据模型 (地理位置信息) --- 2022-

    本章介绍MongoDB地理空间数据如何存储,我们要想使用MongoDB地理信息查询功能,首先得了解如何存储地理空间...

  • MongoDB常用命令

    基本概念 常用命令 MongoDB使用BSON来存储数据和网络数据交换。 MongoDB操作的都是对象。 增 查 ...

  • mongodb使用简介

    mongodb简介 在使用nodejs时候,需要存储一些简单json数据的情况下,很多人会推荐使用mongodb。...

网友评论

    本文标题:使用MongoDB存储数据

    本文链接:https://www.haomeiwen.com/subject/tbbouxtx.html