MongoDB是为快速开发互联网Web应用而设计的数据库系统。它是面向文档的,这里的文档是一种类似于JSON的结构,简单理解MongoDB这个数据库就是存储各种JSON的(其实是BSON,一种二进制的JSON结构)。
数据库是一个仓库,在仓库中可以存放集合。
集合中可以存放文档。
文档是数据库最小的单位,我们存储和操作的内容都是文档。
show dbs
show databases
语法和 MySQL 一样,但是在MongDB中,数据库和集合都不需要手动创建,当我们在创建文档的时候,如果文档所在的集合和数据库不存在会自动创建数据库和集合。
use 数据库名
比如,我们没有 test 数据库,那么我直接来一句 'use test' 也没有问题,直到我们向test数据库真正的插入数据才会创建这个数据库。
db
show collections
db..insertOne(doc)
db..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..update(查询条件,新对象)
db..updateOne(查询条件,新对象)
db..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..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..find( {} )
语法:
db..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;