MongoDB

简介

        MongoDB是为快速开发互联网Web应用而设计的数据库系统。它是面向文档的,这里的文档是一种类似于JSON的结构,简单理解MongoDB这个数据库就是存储各种JSON的(其实是BSON,一种二进制的JSON结构)。

三个概念

数据库(database)

数据库是一个仓库,在仓库中可以存放集合。

集合(collection)

集合中可以存放文档。

文档(document)

文档是数据库最小的单位,我们存储和操作的内容都是文档。

MongDB的基本操作

查看所有数据库

show dbs
show databases

进入指定数据库

    语法和 MySQL 一样,但是在MongDB中,数据库和集合都不需要手动创建,当我们在创建文档的时候,如果文档所在的集合和数据库不存在会自动创建数据库和集合。

use 数据库名

比如,我们没有 test 数据库,那么我直接来一句 'use test' 也没有问题,直到我们向test数据库真正的插入数据才会创建这个数据库。

显示当前数据库名

db

显示当前数据库所有集合

show collections

数据库的CRUD(增删改查)

插入文档

db.<collection>.insertOne(doc)
db.<collection>.insertMany(doc)

例:向 test 数据库中的 students 集合插入一个新的学生对象

 doc:

{name:"燕双鹰",age:18,gender:"男"}
use test;
// db代表的是当前数据库,插入数据前我们必须先进入该数据库
db.students.insertOne(
    {name: "燕双鹰",age: 18,gender: "男"}
);
db.students.insertMany([
    {name: "李大喜",age: 16,gender: "男"},
    {name: "李元芳",age: 20,gender: "男"},
    {name: "石敢当",age: 99,gender: "男"}
]);

 

 

         当我们向集合中插入文档时,如果没有给文档指定 _id 的属性,则数据库会自动给文档添加 _id。这个属性用来作为我们这个文档的唯一标识。这个 _id 是根据时间戳生成的,所以永远不会重复。

        这个 _id 我们也可以自己指定,但必须确保 _id 唯一。

删除文档

语法: 

deleteOne()
deleteMany()

 例子:

// 删除name="李大喜"的文档
db.students.deleteOne(
    {name: "李大喜"}
);

//删除所有gender="男"的文档
db.students.deleteOne(
    {gender: "男"}
);

 

修改文档

语法: update 已经不推荐使用了,我们尽量使用 updateOne 和 updateMany。

// update 默认效果等同于 updateOne 只会对查询到的第一个文档进行修改
db.<collection>.update(查询条件,新对象)
db.<collection>.updateOne(查询条件,新对象)
db.<collection>.updateMany(查询条件,新对象)

注意:update 默认会使用新对象替换旧对象。

例:

修改一个文档:
// 修改name=石敢当的文档为 新的文档
db.students.updateOne(
    {name: "石敢当"},
    {
        $set: {name: "狄如燕",age: 20,gender: "女"}
    }
);
修改所有匹配的文档:
// 把所有name字段=石敢当的文档替换为 新文档
db.students.updateMany(
    {name: "石敢当"},
    {
        $set: {name: "狄如燕",age: 20,gender: "女"}
    }
);
删除文档字段:
// 先增加文档 狄仁杰信息 多加一个字段 "address" 
db.students.insertOne(
    {name: "狄仁杰",age: 50,gender: "男",addess: "山西太原"}
);

// 删除字段 "address" 后面的值可以随便填 因为它只要匹配到 address 这个字段就会直接删除
db.students.updateOne(
    {name: "狄仁杰"},
    {
        $unset: {addess: 404}
    }
);

 删除集合:

db.<collection>.drop();

删除数据库:

集合中集合没了数据库也没了,所以只要删除数据库中所有集合,数据库也就没了。

         除此之外,我们真正开发中一般不会删除数据,比如一些违规言论数据,不可能用户撤回删除我们公司也删除,因为数据是最有价值的东西,我们可能还要拿去分析处理,不可能用户删就删,我们通常对用户想要删除的数据做一个标记只展示给用户:比如下面删除李元芳。

// 给所有文档添加一个字段 isDel 时候被删除 删除-1 未删除-0
db.students.updateMany(
    {$or:[
        {gender: "男"},
        {gender: "女"}
    ]},
    {$set:
       {isDel: 0}
    }
);

// 设置李元芳被删除
db.students.updateOne(
    {name: "李元芳"},
    {
        $set: {isDel: 1}
    }
);

// 查询所有未被删除的人
db.students.find({isDel: 0});

        学到这,我深刻感受到网络不是法外之地,一定不能在网络上信口开河,尤其是键盘侠们,国家应该利用好计算机技术,管制一下网络键盘侠们。 

查询文档

如果想检索集合中的所有文档,可以在find方法中传一个空文档作为查询过滤条件。查询过滤参数确定选择条件:

// find(条件)用来查询集合中所有满足条件的文档
// {} 表示查询集合中所有文档
db.<collection>.find( {} )

等值查询

语法:

db.<collection>.find({属性:值})

 案例:

// 等值查询 查询name为"李大喜"的文档
db.students.find({name: "李大喜"});

多条件查询(AND):

// 查询name为李元芳 age为20的文档
db.students.find({name: "李元芳",age: 20});

// 查询gender为男 age < 50 的文档
db.students.find({gender: "男",age: {$lt: 50}});

OR:

// 查询年龄 <= 19 或者 > 50的人
db.students.find({ $or: [
    {age: {$lte: 19}},
    {age: {$lte: 50}}
]});

 AND 和 OR 复用:

// 查询性别为男 并且 年龄<=19或者>=50
db.students.find({
    gender: "男",

    $or: [
    {age: {$lte: 19}},
    {age: {$lte: 50}}
]});

findOne:

// 查询符合条件的第一个文档
db.students.findOne({gender: "男"});

查询结果的数量:

// 查询所有记录的数量
db.students.find().count;