mongodb数据库从入门到精通

mongodb数据库作为nosql的一种,目前在nosql数据库中的应用排名几乎是数一数二。开发中也会越来越受到重视,这里介绍命令行下操作mongo数据库的相关内容。

基础部分

连接数据库:一般连接数据库,直接使用mongo命令即可,如果连接远程数据库,需要通过--host指定远程数据库主机地址,如果还需要指定端口,那么加上--port参数。


创建数据库:mongo数据库和关系型数据库不一样,也不像cassandra需要创建schema,需要创建时,直接使用use [database]命令即可,如果数据库存在,那么就是切换数据库,如果不存在,就是创建。


删除数据库:这个在测试阶段可以使用,在生产环境还是慎用,毕竟这一步太危险。db.dropDatabase()


查看当前数据库:最简单的命令就是db.stats()。可以显示当前数据库的名称。如果需要产看所有数据库,可以使用show dbs。


向集合新增数据:这里没有说如何创建集合,也没有说,集合长什么样子,我们平时使用mysql,喜欢use mysql,show tables,desc user,等命令看看数据库中的表和表结构。但是mongo数据库作为nosql数据库,集合中的字段很有可能不是固定的,因此无法通过desc来查看表长什么样。和数据库一样,无需手动创建,也无法创建,需要保存数据记录,可以直接通过db.xxx.insert(),db.xxx.save()命令来保存数据,这样,数据表就自动创建了。


删除所有数据:db.xxx.remove({})这样就删除了所有记录。现在不推荐使用remove,可以使用removeOne(),removeMany({}),如果删除指定的数据,可以在{}中指定删除记录的条件。这个条件和查询条件是一样的。不能直接使用db.user.remove(),否则会报错,如果选择全部删除,需要加上{},db.user.remove({})。


修改数据:和删除一样,修改时需要指定记录范围,如果不指定,那么就是全部修改。如下:db.channel.update({},{$set:{'entityStatus':'OK'}},{multi:true});将channel表中所有的实体状态设置为OK,同时,记录有多条,指定multi:true,支持批量操作。


删除集合:db.xxx.drop()


集合查询:db.xxx.find(),这是直接查询所有记录,可以通过{}来指定条件范围。
db.user.find({})

补充:
cls:清屏


db.user.find().pretty(),类似mysql \G 按照行来展示记录的字段、字段值


db.user.find().limit(10) 数据过多,我们只查询几个数据,这其实是分页查询的简单变种,默认我们省略了从哪个下标开始即skip(0)限制参数。 

高级部分

数据类型:mongodb数据类型有string,number,long,numberlong,double,date,int,array,objectid,object,boolean。mongo查询条件里面,我们可以根据参数类型查找,比如{id:{$type:"string"}},就查询出id类型为字符串的数据。这里给出mongo中数据类型与数字的对应关系:

1->Double
2->String
3->Object
4->Array
5->Binary data
7->Object id
8->Boolean
9->Date
10->Null
18->64-bit Integer

关于数据类型,这里需要指出的是,普通的数字类型是1,就是double,我们来验证这个,比如有数据如下:

> db.user.find()
{ "_id" : ObjectId("5c8a36d5a5ff1156d2c1d0db"), "id" : 1, "name" : "zhangsan", "height" : 170 }
{ "_id" : ObjectId("5c8a36dfa5ff1156d2c1d0dc"), "id" : 2, "name" : "lisi", "height" : 175 }
{ "_id" : ObjectId("5c8a36eca5ff1156d2c1d0dd"), "id" : 3, "name" : "wangwu", "height" : 180 }
{ "_id" : ObjectId("5c8a370ba5ff1156d2c1d0de"), "id" : "abc", "name" : "qiangang" }
{ "_id" : ObjectId("5c8a372da5ff1156d2c1d0df"), "id" : "101", "name" : "zhouxx" }

user表中ID为1,2,3是普通的数字类型,abc,101均为字符串类型,按照上面的列表,我们知道{id:{$type:"string"}}可以查询出字符类型的数据,也可以使用{id:{$type:2}}这个查询条件。

> db.user.find({id:{$type:2}})
{ "_id" : ObjectId("5c8a370ba5ff1156d2c1d0de"), "id" : "abc", "name" : "qiangang" }
{ "_id" : ObjectId("5c8a372da5ff1156d2c1d0df"), "id" : "101", "name" : "zhouxx" }
> db.user.find({id:{$type:"string"}})
{ "_id" : ObjectId("5c8a370ba5ff1156d2c1d0de"), "id" : "abc", "name" : "qiangang" }
{ "_id" : ObjectId("5c8a372da5ff1156d2c1d0df"), "id" : "101", "name" : "zhouxx" }
> 

而ID为1,2,3的数字类型,通过{id:{$type:16}}、{id:{$type:18}}均查不到,说明他们不是32位整型或者64位整型,这与我们在java中的类型有些不一样。而我们通过{id:{$type:1}}、{id:{$type:"double"}}、{id:{$type:"number"}}等均查到了。


类型转换:在日常的工作中数据类型基本不会发生大的变化,但是偶尔也有需要更改数据类型的时候,比如日期,日期有用毫秒表示的long类型的,也有date类型的日期类型,为了统一,我们需要对他们进行转换。

> db.birthday.save({id:1,date:new Date().getTime()})
WriteResult({ "nInserted" : 1 })
> db.birthday.save({id:2,date:new Date().getTime()})
WriteResult({ "nInserted" : 1 })
> db.birthday.find()
{ "_id" : ObjectId("5c8a4284a5ff1156d2c1d0e2"), "id" : 1, "date" : 1552564868653 }
{ "_id" : ObjectId("5c8a428aa5ff1156d2c1d0e3"), "id" : 2, "date" : 1552564874957 }
> db.birthday.find().forEach(function(x){x.date=new Date(x.date);db.birthday.save(x);})
> db.birthday.find()
{ "_id" : ObjectId("5c8a4284a5ff1156d2c1d0e2"), "id" : 1, "date" : ISODate("2019-03-14T12:01:08.653Z") }
{ "_id" : ObjectId("5c8a428aa5ff1156d2c1d0e3"), "id" : 2, "date" : ISODate("2019-03-14T12:01:14.957Z") }

聚合查询:db.xxx.aggregate(),可以指定返回的字段,也可以指定匹配条件,还可以指定分组字段和聚合函数。

加上过滤条件$match的查询:

> db.birthday.aggregate({$project:{id:1,_id:0,date:{$dateToString:{format:'%Y',date:"$date"}}}})
{ "id" : 1, "date" : "2019" }
{ "id" : 2, "date" : "2019" }
{ "id" : 3, "date" : "2019" }
{ "id" : 4, "date" : "2019" }
{ "id" : 5, "date" : "2019" }
{ "id" : 6, "date" : "2018" }
> db.birthday.aggregate({$project:{id:1,_id:0,date:{$dateToString:{format:'%Y',date:"$date"}}}},{$match:{date:{$eq:"2018"}}})
{ "id" : 6, "date" : "2018" }
>  

数据备份:mongodump,mongorestore

备份和恢复:这里在我的linux上备份,然后将其恢复在我的windows系统上的mongodb中。

mongodump --db webapp --collection birthday --out webapp

win7上的数据库 

将linux上通过mongodump导出的表文件夹拷贝到win7本地的mongodb安装文件夹下,然后进入命令行。恢复命令如下:

mongorestore --dir webapp --db test 

恢复之后,验证数据。 

这里只是总结的常规的mongodb相关的操作,全部是在命令行下操作的,mongodb的使用更多的是用来做nosql数据存储,因此在应用中使用才是最重要的。 

  • 10
    点赞
  • 142
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luffy5459

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值