MongoDB的使用


一、MongoDB简介

  • MongoDB是为快速开发互联网web应用而设计的数据库系统。
  • MongoDB的设计目标是极简、灵活、作为web应用栈的一部分。
  • MongoDB的数据模型是面向文档的,所谓文档是一种类似于JSON的结构,简单理解MongoDB这个数据库中存得是各种各样得JSON。(BSON增强版的json)。

二、MongoDB三个概念

  • 数据库(database):数据库是一个仓库,在仓库中可以存放集合。
  • 集合 (collection):集合类似于数组,在集合中可以存放文档。
  • 文档 (document):文档数据库中的最小单位,我们存储和操作的内容都是文档。

在MongoDB中,数据库和集合豆豆不需要手动创建,当我们创建文档时,如果文档所在的集合或数据库不存在会自动创建数据库和集合。

三、Windows安装MongoDB

参考自己的博文:

四、操作Mongo数据库

基本的指令:

#显示当前的所有数据库
show dbs
show databases

#进入到指定的数据库中
use 数据库名

#表示当前所处于哪个数据库
db

#查看数据库里面所有的集合
show collections

数据库的增删改查(CURD)

#向数据库中插入文档
db.<集合名称>.insert(doc)

#向集合中插入一个文档
#例如,向test数据库中的stus集合中插入一个新的学生对象
{name:"孙悟空",age:18,gender:"男"}
#输入以下命令
db.stus.insert({name:"xia",age:22,gender:"male"});

查找集合的文档内容

 db.stus.find()

五、安装MongoDB图形化工具【有很多中工具(Studio 3T)选择适合自己的即可】

下载地址:https://www.mongodbmanager.com/download-mongodb-manager-free

下载之后傻瓜式的安装即可,连接MongoDB数据库

注意:如果遇到无法输入中文直接退出重启一下就可以了。

六、数据库操作

1、插入文档

/*向集合中插入1个文档*/
db.stus.insert({name:"夏天",age:18,gender:"男"});
/*向集合中插入多个文档*/
db.stus.insert([
{name:"小一",age:22,gender:"男"},
{name:"小二",age:22,gender:"女"},
{name:"小三",age:22,gender:"女"}
]);
db.stus.find();
/*生成ID码*/
ObjectId()
/*自定义ID*/
db.stus.insert({_id:"hello",name:"夏天",age:18,gender:"男"});

db.集合名称.insertOne()       #插入一个文档,里面不能有数组

db.集合名称.insertMany()     #插入多个文档,里面必须是数组

2、查询文档

/*
查询  
   db.collection.find()
   - find()用来查询集合中所有符合条件的文档
   - find()可以接收一个对象作为条件参数
       {} 表示查询集合中所有的文档
       {属性名:值} 查询属性是指定值的文档
   - find()返回的是一个数组
   
   db.collection.findOne()
   - 用来查询集合中符合条件的第一个文档
   - findOne()返回的是一个文档对象
   
   db.collection.find({}).count()
   - 查询所有结果的数量
*/
/*查询指定条件的文档,id是hello的文档*/
db.stus.find({_id:"hello"});
/*查询指定条件的文档,age是22,name是小三*/
db.stus.find({age:22,name:"小三"});
/*查询指定条件的文档,age是22,查询数组索引为1的文档*/
db.stus.find({age:22})[1];
/*查询指定条件的文档,age是22,返回的是一个对象*/
db.stus.findOne({age:22});
/*查询所有结果的总数*/
db.stus.find({}).count();

3、修改文档

/*
  修改
  db.collection.update(查询条件、新对象)
    - update()默认情况下会使用新对象来替换旧的对象
    - 如果需要修改指定的属性,而不是替换需要使用"修改操作符"来完成修改
        $set 可以用来修改文档中的指定属性
        $unset 删除文档中指定的属性
    - update 默认情况只会修改一个  
    
  db.collection.updateMany()
    - 同时修改多个符合条件的文档

  db.collection.updateOne()
    - 修改一个符合条件的文档 
 
  db.collection.replaceOne()
    - 替换一个文档 
*/

//查询结果
db.stus.find({});
//替换掉所有的内容,仅剩下age信息
db.stus.update({name:"小三"},{age:1});
//替换指定的某一个或多个内容
db.stus.update(
   {"name":"夏天"},
   {$set:{
    name:"Hello"
    }}
);
//删除文档中指定的一个或多个属性,删除gender属性
db.stus.update(
   {"name":"夏天"},
   {$unset:{
    gender:"男"
    }}
);
//目前小一存在两个,使用updateMany将同时修改两个文档,将其address修改为香港
db.stus.updateMany(
   {"name":"小一"},
   {
     $set:{
           address:"香港"
     }
   }
);
//查询结果
db.stus.find();
//小一有多个的情况下只修改一个
db.stus.updateOne(
   {"name":"小一"},
   {
     $set:{
     address:"香港九龙"
     }
   }
);
//multi:true,也是表示小一有多个的情况下,同时修改多个
db.stus.update(
   {"name":"小一"},
    {
        $set:{
        address:"香港平顶山"
        }
     },
     {
        multi:true
     }  
);

 4、删除文档

/*
    删除
    db.collection.remove()
    - 删除符合条件的所有的文档(默认情况下会删除多个)
        如果remove()第二个参数传递一个true,则只会删除一个
        如果传递空对象则删除所有
    db.collection.deleteOne()
    db.collection.deleteMany()
        - remove()可以根据条件来删除文档,传递的条件的方式和find()一样
    db.collection.drop()删除集合
    db.dropDatabase()删除数据库  
  
        -一般数据库中的数据都不会删除,所以删除的方法很少调用
*/
db.stus.find();
db.stus.remove({_id:"hello"});
//删除name为小一的文档(删除多个)
db.stus.remove({name:"小一"});
//删除name为小二的文档(只删除1个)
db.stus.remove({name:"小二"},true);
//传递空对象则删除所有的文档【清空集合,一个一个删除(性能略差)】
db.stus.remove({});
//清空集合(性能高)
db.stus.drop();

七、练习1

1、进去my_test数据库

show dbs
use my_test
db

2、向数据库的user集合中插入一个文档

db.user.insert({name:"夏天",age:"12",gender:"女"});

3、查询user集合中的文档

show collections
db.user.find();

4、向数据库的user集合中插入一个文档

db.user.insert({name:"春天",age:"14",gender:"女"});

5、查询数据库user集合中的文档

db.user.find();

6、查询数据库user集合中的文档数量

db.user.find().count();

7、查询数据库user集合中name为"春天"的文档

db.user.find({name:"春天"});

8、向数据库user集合中的name为"春天"的文档,添加一个address属性,属性值为"香港"

db.user.update(
    {name:"春天"},
    {$set:{address:"香港"}}
);

9、使用{name:"春天"} 替换 name 为 "张三" 的文档

db.user.update(
    {name:"春天"},
    {$set:{name:"张三"}}
);

10、删除 name 为 张三 的文档的address属性

db.user.update(
    {name:"张三"},
    {$set:{address:"广州"}}
);

11、向name为夏天的文档中,添加一个hobby:{cities:["beijing","shanghai","shenzhen"], movies:["sanguo","hero"]}

db.user.update(
    {name:"夏天"},
    {$set:{hobby:{cities:["beijing","shanghai","shenzhen"], movies:["sanguo","hero"]}}}
);

12、向name为张三的文档中,添加一个hobby:{movies:["A Chinese Odyssey","King of comedy"]}

db.user.update(
    {name:"张三"},
    {$set:{hobby:{movies:["A Chinese Odyssey","King of comedy"]}}}
);

13、查询喜欢的电影hero的文档

MongoDB支持直接通过内嵌文档的属性进行查询,如果要查询内嵌文档则可以通过.的形式匹配
如果要通过内嵌文档来对文档进行查询,此时属性名必须使用引号,对数组或元素进行匹配
db.user.find({'hobby.movies':"hero"});

14、向张三中添加一个新的电影Interstellar

$push 用于向数组中添加一个新的元素
$addToSet 向数组中添加一个新元素,如果数组中已经存在该元素则不会重复添加
db.user.update(
    {name:"张三"},
    {$push:{"hobby.movies":"Interstellar"}}
);
db.user.update(
    {name:"张三"},
    {$addToSet:{"hobby.movies":"Interstellar"}}
);

15、删除喜欢beijing的用户,(删除cities里面包含beijing的用户)

db.user.remove({"hobby.cities":"beijing"});

16、删除user集合

db.user.remove({});
db.user.drop();
show dbs;

17、向numbers中插入2000条数据,使用for循环

for(var i=1; i<=20000; i++){
    db.numbers.insert({num:i});
}
#以上方式效率太低了,每循环一次得insert一次

优化方案:尽量在调取方法之前讲数据处理完再一次性插入数据

var arr = [];
for(var i=1; i<=20000; i++){
    arr.push({num:i});
}
db.numbers.insert(arr);

18、查询numbers中num为500的文档

db.numbers.find({num:500});

19、查询numbers中num大于5000的文档

db.numbers.find({num:{$gt:5000}});
//大于等于5000的文档
db.numbers.find({num:{$gte:5000}});

20、查询numbers中num小于30的文档

db.numbers.find({num:{$lt:30}});
db.numbers.find({num:{$lte:30}});

21、查询numbers中num大于40小于50的文档

db.numbers.find({num:{$gt:40,$lt:50}});

22、查询numbers中num大于19996的文档

db.numbers.find({num:{$gt:19996}});

23、查询numbers集合中的前10条数据

db.numbers.find().limit(10);

24、查询numbers集合中的第11条到20条数据

db.numbers.find().skip(10).limit(10);

25、查询numbers集合中的第21条到30条数据

#skip((页码-1)*每页显示的条数).limit(每页显示的条数);
db.numbers.find().skip(20).limit(10);

#skip与limit的位置可以互换效果一样
db.numbers.find().limit(10).skip(20);

八、数据库文档之间的关系

 1、文档之间的关系:一对一;一对多;多对多