mongodb的基本crud操作

一.MongoDB的认识


1.什么是MongoDB?
一种数据库,而且是非关系型数据库。
2.MongoDB的优点
1、可以快速开发web型应用,因为灵活,不用像关系型数据库一样需要建表
2、MongoDB存储的是文档(document),文档内存储的是类似json的结构,所谓json就是字符串数组

2、MongoDB常见的命令
– 开启服务器: net start MongoDB
– 关闭服务器: net stop MongoDB
– 打开客户端: mongo,在cmd窗口输入便可以连接上数据库

3、MongoDB的数据库分类
3.1、数据库(database):用来存储集合的,而且数据库也有分大小。
3.2、集合(collection):集合类似于数组,用于存放文档的
3.3、文档(document): 文档是MongoDB数据库中最小的单位,我们要操作的目标就是文档。
mongodb的基本crud操作_第1张图片

MongoDB关系: 数据库(database) > 集合(collection)> 文档(document)

值得注意的是: 在MongoDB中不需要自己创建数据库和集合,便可以直接创建文档,其实就是在创建文档的同时,会将数据库和集合创建了。

4、现在便是开始操作MongoDB数据库了

Download NoSQL Manager for MongoDB

我用的这个navicat15,因为公司用的,上面那个也用过。具体操作不太会,可以去看看尚硅谷的mongodb视频里的连接视图可视化工具。亲测第一个好用得多!

二.基本常识

1.查看数据库

show dbs 
//admin   0.000GB     
//config  0.000GB
//local   0.000GB
//test    0.000GB     上面的都是数据库自带的,这个test是自己创建的

ps:mongodb直接插入一条文档,会自动创建不存在的数据库和集合

2.使用数据库

use test

3.查看这个数据的collections(集合)

show collections

4.查看这个集合里的数据

db.collection.find(query)

collection指的是某一个集合,query是指的查询条件,下面查询语法时再解释,默认不写,就是查询所有数据

db.student.find()

5.查看当前在哪个数据库

db

三.使用CRUD的操作

具体内容查看官方文档: MongoDB CRUD Operations — MongoDB Manual

核心: 增: insert() 删: remove() 查: find() 改: update()

mongodb的基本crud操作_第2张图片

1.新增 

db.集合名.insert(document) 表示增加一个或多个文档

插入单个

db.student.insert({
name:"刘渝",sex:"男",age:"24"
});

查看db.student.find();

插入多个

db.student.insert([{
name:"刘渝",sex:"男",age:"24"
},{
name:"张思美",sex:"女",age:"18"
}]);

db.集合名.insertOne(document,[callback]) 表示插入一个文档,回调函数callback是可选的

mongodb的基本crud操作_第3张图片

 db.student.insertOne({
name:"刘渝",sex:"男",age:"24"
});

db.集合名.insertMany(doucment, [callback]); 表示插入多个文档

db.piyou.insertMany([
    {name:"白骨精", age:20,address:"白骨洞"}, 
    {name:"蜘蛛精", age: 24, address:"蜘蛛洞"}
]);
    可以看到,用法是和insert是相差不多的。数组里面有对象,对象即是文档。

2.查找
 

要想查询上面插入的内容,便可调用查找的方法

db.集合名.find(condition); 查询一个或多个文档 condition是查询条件

db.student.find();查询所有

db.student.find({});查询所有

db.student.find({age:"24"});查询年龄为24的文档

默认查询多个

db.集合名.findOne(condition); 查询一个文档

db.集合名.findMany(condition) 查询多个文档

6.count()

db.集合名.find(condition).count(); 使用count()来计数

db.student.find({age:"24"}).count();

7.投影(就是限制条件,显示效果)

首先先创建一个集合:

db.staff.insert([
    {name:"小白", age: 18, salary: 3000},
    {name:"大白", age: 19, salary: 3500},
    {name:"熊大", age: 23, salary: 3200},
    {name:"熊二", age: 22, salary: 3100},
    {name:"光头强", age: 27, salary: 3400},
    {name:"小鲤鱼", age: 17, salary: 1500},
    {name:"奥特曼", age: 39, salary: 4500}
]);
/*
	这样创建的是一个列表集合。
*/

sort()方法

需求一:按照薪资排列,可以使用sort()方法

sort(condition)

sort({salary: 1})表示按照薪资升序排列

sort({salary: -1})表示按照薪资降序排列

db.staff.find().sort({salary: 1});

db.staff.find().sort({salary: 1, age: -1}); 这句的含义是按照薪资升序排序,如果出现了相同的薪资的人, 则按照年龄降序排序

8.limit() 限制 和skip() 跳过, 这两个方法经常可以一起使用,从而用来翻页。 而且这两个方法是可以不分先后的。

db.staff.find().limit(2);  表示只会显示前两个数据

db.student.find().skip(0).limit(2);表示跳过0条数据,展示2个文档

db.student.find().skip(2).limit(2);表示跳过2条数据,展示2个文档

skip和limit可以互换位置    skip的计算与mysql的limit分页一样,类似于pagenum

(当前页数-1)*pagesize      

   skip的参数      limit的参数

9.投影时显示的字段的设置

在查询时可以在find()中的第二个参数的位置传入 投影, {name: 1, _id: 0}: 表示显示name属性,不显示_id属性。

db.staff.find({}, {name: 1, _id: 0, salary: 1});
/*
	这句的含义是只显示 name和salary属性,不显示 _id属性
*/

类似于mysql的select name,salary from staff;

3.修改

db.集合名.update(condition,newObject);        修改一个或多个文档
db.集合名.uodateOne(condition,newObject);    修改一个文档
db.集合名.updateMany(condition, newObject);  修改多个文档
condition: 查询的条件        newObject: 需要修改的语句
首先需要注意的是,在使用update()时,需要一个新的玩意加入,叫做修改操作符,一般长成:

$set        表示需要设置指定的属性
    $unset        表示需要删除指定的属性
    $push        表示给数组添加一个新元素,因为文档内也会有数组,数组便会有数组元素
    $addToset     表示给数组添加一个新元素,和push的区别是,如果出现同名的数组元素,则不会再添加
    $gt            大于
    $gte        大于等于
    $lt            小于
    $lte        小于等于
    $or [{条件一,条件二}]        表示或的意思,符合条件一或者条件二    
    $inc        表示自增,用在在原来数据的基础上对数据加减,可用于加薪减薪的操作


所以不能像下面这条语句这样使用,这样使用的话,会使用{age:18}覆盖掉{name:“猪八戒”…}这整条语句。

db.student.update({name:"刘渝"}, {name:"刘帅渝"});   会把一个文档全部替换掉只有name:"刘帅渝"

db.student.update({name:"刘帅渝"}, {$set:{age:24}});这样会在原有的基础上,没有这个age就新增,有就去修改

4.修改(慎重使用,删除了集合就什么都没有了,也找不回)

db.集合名.remove(condition) 删除符合条件的一个或多个文档

db.集合名.deleteOne(condition) 删除符合条件的一个文档

db.集合名.deleteMany(condition) 删除符合条件的多个文档

db.student.remove({name:"刘帅渝"});

5.练习题

1.语句解释: 向集合persons中插入一个数组,数组中有两个文档,文档内有一个hobby的文档, 这个hobby文档被称作内嵌文档,然后hobby文档内有两个数组。

db.persons.insert([
    {
	    name:"大大白", 
	    age: 28, 
	    hobby:{
	        music:['new Boy', '云烟成雨', '秋酿'],
	        games:['王者荣耀', '和平精英', '光遇']
	    }
    },
    {
        name: "小白",
        age: 21,
        hobby:{
            movies:['大话西游', '唐伯虎点秋香'],
            games:['王者荣耀', '旅行青蛙', '穿越火线']
        }
    }
]);

需求一:查询喜欢玩 王者荣耀 的人

分析:王者荣耀是存在于hobby中的games

db.persons.find({"hobby.games":"王者荣耀"});
/*
	这是需要注意的知识点:如果查询的是内嵌文档可以使用 . 的方式查询,
	不过需要使用引号,这是因为mongodb的文档是json的缘故吧。
*/

需求二: 插入20000条数据,有哪种是比较快捷的方式?
方式一:

for(let i = 1; i <= 20000; i++){
    db.nums.insert({num:i});
}
/*
	这是方式一,这种方式是需要调用insert语句20000次,效率会十分低下,那么可不可以,
	只调用一次insert语句呢?如果可以的话,应该怎么实现呢?
	可以将数据先存储起来,然后一次性加入。
*/

方式二:

const arr = [];
for(let i = 1; i <= 20000; i++){
    arr.push({num:i});
}
db.nums.insert(arr);
/*
	这是将数据全部存到了数组中,随后再将数组插入,只执行了一次insert语句。
	如果还有更好的想法都可以去尝试。还有就是自己给自己出题目,如果都能够实现的话,
	那么说明你学的差不多了。
*/

四.文档间的关系(三种)

1.一对一(one to one)  一个妻子文档里插入一个对应的丈夫文档形成的一对一关系

-- 内嵌文档
-- 夫妻关系
db.wife.insert([
    {
        name:"黄蓉",
        age: 26,
        handsband:{
            name:"郭靖",
            age: 38
        }
    },
    {
        name: "小兰",
        age: 16,
        handsband:{
            name: "新一",
            age: 16
        }
    }
]);
/*
	可以看到一个妻子是对应一个丈夫的,这是使用内嵌文档来实现的。
*/

2.一对多(one to many)在每个文档里插入一个对应的外键

类似于mysql设置的外键,这里mongodb在每个文档里插入一个对应的外键

-- 父母 - 孩子
-- 文章 - 评论
-- 内嵌文档也可以实现,就是一个文档内嵌多个文档,不过比较繁琐
-- 用户一个文档,订单一个文档,在使用的时候再一一对应
// 第一句是创建了两个用户, 分别是花木兰和诸葛亮
db.users.insert([{name:"花木兰"}, {name:"诸葛亮"}]);
// 这一句是查询用户内容, 这是需要知道用户的_id,从而在第三句加入
db.users.find();
// 这是生成了一个订单,并且user_id存储的是花木兰的id
db.orders.insert({list_name:["配马", "鞍鞯"], user_id: ObjectId("61374eac77393663e2de9bd3")})
// 再生成了一个订单,并且user_id存储的是花木兰的id
db.orders.insert({list_name:["蜜糖", "男装"], user_id: ObjectId("61374eac77393663e2de9bd3")})
// 在users里查找到 花木兰 这个用户的id,并将其存储起来
let userId = db.users.findOne({name:"花木兰"})._id;
// 使用id来查找
db.orders.find({user_id: userId});

3.多对多(many to many)在每一个文档里插入外键数组

-- 学生 - 老师
-- 商品 - 分类
-- 可以使用内嵌文档的形式完成
db.teas.insert([{name:"诸葛亮"}, {name:"龟仙人"}, {name:"唐僧"}]);
db.teas.find();
db.stus.insert([
    {
        name: "孙悟空",
        // 插入的是 龟仙人和唐僧的id
        teas_id:[ObjectId("6137552877393663e2de9bdb"), ObjectId("6137552877393663e2de9bdc")]
    },
    {
        name: "刘禅",
        // 插入的是 诸葛亮和龟仙人的id
        teas_id:[ObjectId("6137552877393663e2de9bda"),ObjectId("6137552877393663e2de9bdb")]
    }
        
]);

db.stus.find();

你可能感兴趣的:(mongodb的学习,mongodb)