简介
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;