MongoDB 入门实战

一.基本概念的理解

MongoDB是一个基于分布式文件存储的数据库。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

在NoSql的数据库中,操作数据都是通过指令或程序语言完成的,比如在MongoDB中使用过Javascript和JSON数据结构,来操作和管理数据的。

数据库对应关系

传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB 是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。

数据库(Database)

数据库(Database)

集合(Collection)

数据表(Table)

文档(Document)

记录(Record)

 

 

 

 

数据库使用步骤

  1. 建立数据库(xdarker)
  2. 建立数据集合(Posts, Categories, Tags)
  3. 建立数据(Post:{"_id":"","title":""})
xdarker
Posts
{"_id":"1","title":"我的第一篇博客"}
{"_id":"2","title":"我的第二篇博客"}
{"_id":"3","title":"我的第三篇博客"}
Categories
{"_id":"1","title":"炉石"}
{"_id":"2","title":"吃鸡"}
Tags
{"_id":"1","title":"钢铁侠系列"}
{"_id":"2","title":"复仇者系列"}
{"_id":"3","title":"蜘蛛侠系列"}

二.简简单单NoSql

进入MongoDB shell

mongo

创建数据库xdarker

use xdarker;

查看所有数据库

show dbs;

可以看到,我们刚创建的数据库 xdarker 并不在数据库的列表中, 要显示它,我们需要向 xdarker 数据库插入一些数据。

db.xdarker.insert({"name":"钢铁侠"})

MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中。

注意: 在 MongoDB 中,集合只有在内容插入后才会创建! 就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。

删除当前数据库

db.dropDatabase()

创建集合Collection

use xdarker;
db.createCollection("posts");
db.createCollection("categories");
db.createCollection("tags");

查看所有集合

show collections;

三.操作集合(Collection)

重命名集合

db.createCollection("users");
show collections;
db.users.renameCollection("staff");

删除集合

db.staff.drop();

四.操作文档(Document)

往集合中插入数据

db.posts.insert(
 {
     title: "我的第一篇博客",
     content: "已经开始写博客了,太激动了。"
 }
);
db.posts.insert(
 {
    title: "我的第二篇博客",
    content: "写点什么好呢?",
    tag: ["未分类"]
 }
);

查看已插入文档

db.posts.find();

查看文档数量

db.posts.count();

移除所有文档

五.带条件的文档 db.find

知识点

db.[collection_name].find({"":""})
MongoDB中条件操作符有:
$gt -------- greater than  >
$gte --------- gt equal  >=
$lt -------- less than  <
$lte --------- lt equal  <=
$ne ----------- not equal  !=
$eq  --------  equal  =
正则表达式:/k/, /^k/
db.[collection_name].distinct("field_name");

查询tag 为 game 的文档数据

db.posts.find({"tag": "game"});

查询 rank 大于等于 4 的文档数据

db.posts.find({"rank": {$gte: 4}});

查询 rank 大于 4 的文档数据

db.posts.find({"rank": {$gt: 4}});

 查询 rank 小于等于 4 的文档数据

db.posts.find({"rank": {$lte: 4}});

查询 rank 小于 4 的文档数据

db.posts.find({"rank": {$lt: 4}});

db.posts.find({"title": /A/}); #取出文章标题带A的数据
db.posts.find({"title": /^J/}); #取出文章标题J开头的数据
db.posts.find({"title": /^P/});#取出文章标题P开头的数据
db.posts.distinct("tag");#取出文章tag

六.复杂条件查询

知识点

# db.[collection_name].find({"":"", "":""}) (多个条件)
# db.[collection_name].find({$or:[{...},{...}]}); (与或非)
# db.[collection_name].find({"": {$in: [...]}}); (in查询)
# db.[collection_name].find({"": {$exists: true}});

查询标题带A并且rank大于等于2的数据

db.posts.find({"title": /A/, "rank":{$gte:2} });

标题带A或者rank大于等于4的数据

db.posts.find({$or: [{"title": /A/}, {"rank":{$gte:4}}] });

查询 rank 排名为3和4的数据

db.posts.find({"rank": {$in: [3,4]} });

取出 存在istop 的数据

> db.posts.insert({ "title":"科技自立", "istop": true });
> db.posts.find({"istop": {$exists: true} }); 

七.指定抽出字段

知识点

 db.[collection_name].find({},{field1:true,field2:1});
 find 第一个参数为条件,第二个参数为要取出的字段(true,1是相同的意思)

指定title和rank 显示(默认抽出id)

db.posts.find({}, {title:true, rank:1});

指定title和rank 显示 不抽出id

八.文档的方法

知识点

sort() 排序
limit() 分页
skip() 跳过

 按照rank 升序排序

db.posts.find({},{_id:0}).sort({rank:1});

按照rank 降序排序

db.posts.find({},{_id:0}).sort({rank:-1}); 

按照默认的顺序抽出前三条

db.posts.find({},{_id:0}).limit(3); 

按照rank 降序排序取前三条

db.posts.find({},{_id:0}).sort({rank:-1}).limit(3);

只抽出一条数据

 跳过前三条(1-3),取三条数据(4-6)

db.posts.findOne({},{_id:0});
db.posts.find({},{_id:0}).skip(3).limit(3);

九.文档更新 update

update(<filter>,<update>,<options>)
(参数: 过滤器(条件),更新字段的详细,更新行为)

> db.posts.findOne({"title":"JAVA"});
> db.posts.update({"title":"JAVA"}, {$set: {"rank": 10} }); #修改 title为JAVA的rank 为
> db.posts.update({"title":"JAVA"}, {"rank": 99}); #删除本条数据的其他字段只保留_id和rank:99
> db.posts.update({"tag":"it"}, {$set: {"rank": 50}});  #只更新查询到的tag为it的第一条数据的rank
> db.posts.update({"tag":"it"}, {$set: {"rank": 60}}, {multi: true});   #更新全部tag为it的第一条数据的rank

十.玩几个特殊函数 inc mul rename set unset

知识点

# $inc:递加
# $mul:相乘
# $rename:改名
# $set:新增or修改
# $unset:字段删除
> db.posts.find({title:"JAVA"}, {_id:0});
> db.posts.update({title:"JAVA"}, {$inc: {rank: 1}});  #+1
> db.posts.find({title:"JAVA"}, {_id:0});
> db.posts.update({title:"JAVA"}, {$mul: {rank: 2}}); #*2
> db.posts.find({title:"JAVA"}, {_id:0});
> db.posts.update({title:"JAVA"}, {$rename: {"rank": "score"}}); #字段改名为score
> db.posts.find({title:"JAVA"}, {_id:0});
> db.posts.update({title:"JAVA"}, {$set: {"istop": true}});  #删除字段istop
> db.posts.find({title:"JAVA"}, {_id:0});
> db.posts.update({title:"JAVA"}, {$unset: {"istop": true}});   #删除字段istop
> db.posts.find({title:"JAVA"}, {_id:0});

十一.文档的特殊更新 upsert

> db.posts.find({}, {_id:0});
> db.posts.update({title:"其实创造比大志好玩"}, {title:"其实创造比大志好玩", "rank":5,"tag":"game"});
> db.posts.find({}, {_id:0});
> db.posts.update({title:"其实创造比大志好玩"}, {title:"其实创造比大志好玩", "rank":5,"tag":"game"}, {upsert:true});
> db.posts.find({}, {_id:0});
> db.posts.update({title:"其实创造比大志好玩"}, {title:"其实创造比大志好玩", "rank":7,"tag":"game"}, {upsert:true});
> db.posts.find({}, {_id:0});
> db.posts.remove({title:"其实创造比大志好玩"});
> db.posts.find({}, {_id:0});

十二.使用索引 createIndex getIndexes

查询集合索引信息

db.posts.getIndexes()

MongoDB默认会为插入的文档生成_id字段(如果应用本身没有指定该字段),_id是文档唯一的标识,为了保证能根据文档id快递查询文档,MongoDB默认会为集合创建_id字段的索引。

> db.posts.getIndexes();
[
        {
                "v" : 2,                 // 索引版本
                "key" : {
                        "_id" : 1        // 根据_id字段升序索引
                },
                "name" : "_id_",         // 索引的名称
                "ns" : "xdarker.posts"   //集合名
        }
]

创建索引,对 rank 创建了单字段索引,通过{rank: -1}来指定降序索引

db.posts.createIndex({rank:-1});

删除索引

db.posts.dropIndex({rank:-1});

十三.备份和恢复 mongodump mongorestore

mongodump命令脚本语法如下:
>mongodump -h dbhost -d dbname -o dbdirectory
-h:
MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
-d:
需要备份的数据库实例,例如:test
-o:
备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。
mongorestore命令脚本语法如下:
>mongorestore -h <hostname><:port> -d dbname <path>
--host <:port>, -h <:port>:
MongoDB所在服务器地址,默认为: localhost:27017
--db , -d :
需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
--drop:
恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦!
<path>:
mongorestore 最后的一个参数,设置备份数据所在位置,例如:c:\data\dump\test。
你不能同时指定 <path> 和 --dir 选项,--dir也可以设置备份目录。
--dir:
指定备份的目录
你不能同时指定 <path> 和 --dir 选项。

 

参考资料:小马视频,菜鸟教程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值