1. 数据库简介
SQL:结构化查询语言
2. MongoDB简介
BSON:二进制JSON
3. 将MongoDB设置为系统服务
4. MongoDB的基本操作
在MongoDB中,数据库和集合都不需要我们手动创建,当我们创建文档时,如果文档所在的集合或数据库不存在,她会自动创建数据库和集合!
-
基本指令
-
show dbs:显示当前所有数据库
show database:显示当前所有数据库
-
use 数据库名:进入到指定的数据库中(可以不存在)
-
db:表示我们当前所处的数据库
-
show collections:显示我们数据库中所有的集合
-
-
CRUD操作
-
向数据库中插入文档
db..insert(doc):向集合中插入文档
向test数据库中的stus集合中插入一个新的学生对象
db.stus.insert ( {name:“孙悟空”,age:18,gender:”男“} )
-
查询集合中的所有文档
db..find()
-
5. 安装图形化工具
6. 插入文档
db.collection.insert()
- 向集合中插入一个或多个文档
- 当我们向集合中插入文档时,如果没有给文档指定_id属性,则数据库会自动给文档添加_id
该属性用来作为文档的唯一标识 - _id可以自己指定,如果我们指定了,数据库就不会再添加了,如果自己指定_id必须也确保唯一性
- db.collection.insertOne():插入一个文档对象
- db.collection.insertMany():插入多个文档对象
db.stus.insert({
name:"冉海锋",age:28,gender:"男"})
db.stus.find()db.stus.insert([
{
name:"沙和尚",age:36,gender:"男"},
{
name:"白骨精",age:16,gender:"女"},
{
name:"蜘蛛精",age:14,gender:"女"}
])
-
$push:用于向数组中添加一个新的元素
db.user.update({username:"tangseng"},{$push:{"hobby.movies":"Interstellar"}})
-
$addToSet:向数组中添加一个新元素(类似于向set集合中添加,如果数组中已经存在了该元素,则添加失败,因为不可重复)
db.user.update({ username:"tangseng"},{ $addToSet:{ "hobby.movies":"Interstellar"}})
7. 查询文档
db.collection.find()
-
find()用来查询集合中所有符合条件的文档
-
find()可以接收一个对象作为条件参数
- { }:表示所有文档
- { 属性:值 }:查询属性是指定值的文档
- 返回值是一个数组
-
db.collection.findOne()
-
用来查询集合中符合条件的第一个文档
-
返回的是一个文档
-
-
db.stus.find({}).count():查询所有结果的数量
db.stus.find({
name:"冉海锋"})
db.stus.findOne({
name:"冉海锋"})
db.stus.find({
name:"冉海锋"})[0]
db.stus.find({
}).length()
8. 修改文档
- db.collection.update(查询条件,新对象)
- update()默认情况下会使用新对象来替换旧对象
- update()默认只会修改一个对象
如果需要修改指定的属性,而不是替换,需要使用 “修改操作符” 来完成修改
- $set:可以用来修改文档中的指定属性
- $unset:可以用来删除文档的指定属性
db.collection.updateMany():同时修改多个符合条件的文档
db.collection.updateOne():修改一个符合条件的文档
db.collection.replaceOne():替换一个符合条件的文档
-
MongoDB的文档的属性值也可以是一个文档,当一个文档的属性值是文档时,我们称这个文档为内嵌文档
-
MongoDB支持直接通过内嵌文档的属性进行查询,如果要查询内嵌文档可以则可以通过==.的形式来匹配,且属性名必须使用引号==,双引号单引号都可以
db.user.find("hobby.movies":"hero");
db.stus.find()
db.stus.update(
{
name:"沙和尚"},{
age:28}
)
db.stus.update(
{
"_id" : ObjectId("5f86edc1048d21081bd45f3b")},
{
$set:{
gender:"男", address:"流沙河" }} )
db.stus.update(
{
"_id" : ObjectId("5f86edc1048d21081bd45f3b")},
{
$unset:{
address:"流沙河" }} )
db.stus.updateMany(
{
"name" :"冉海锋"},
{
$set:{
address:"高老庄" }} )
db.stus.find()
db.stus.update(
{
"name" :"冉海锋"},
{
$set:{
address:"呵呵呵" } },
{
multi:true } )
db.stus.find()
9. 删除文档
- db.collection.remove()
- 可以根据条件来删除文档,传递条件的方式和find()一样
- 能删除符合条件的所有文档,默认删除多个
- 如果第二个参数传递一个true,则只会删除一个
- 如果只传递一个{ }作为参数,则会删除集合中的所有文档
- db.collection.deleteOne()
- db.collection.deleteMany()
- db.collection.drop():删除集合(如果最后一个集合没了,数据库也没了。。。)
db.stus.remove({
age:28},true)
db.stus.remove({
}) //性能差
db.stus.drop()
db.dropDatabase()
- 一般数据库中的数据都不会删除,所以删除的方法很少调用,一般会在数据中添加一个字段,来表示数据是否被删除
10. 练习
//添加两万条数据的性能高,尽量少调用系统的方法
var arr=[];
for(var i=1;i<=20000;i++){
arr.push({
num:i});
}
db.user.insert(arr);
//查询numbers中num大于5000的文档
db.unmbers.find({
num:{
$gt:500}})
//查询numbers中num小于30的文档
db.unmbers.find({
num:{
$lt:500}})
//查询numbers中num大于40小于50的文档
db.numbers.find({
num:{
$gt:40,$lt:50}})
//查询numbers前10条的数据
db.numbers.find({
num:{
$lte:10}})
//limit()设置显示数据的上限
db.numbers.find().limit(10)
//查询numbers中第11条到20条的数据
//skip()用于跳过指定数量的数据 skip( (页码-1)*每页显示的条数 ).limit(每页显示的条数)
//MongoDB会自动调整limit()和skip()的位置
db.numbers.find().skip(10).limit(10)
db.numbers.find().limit(10).skip(10)
11. 文档间的关系
-
一对一(one to one)
-
夫妻
-
在MongoDB中,可以通过内嵌文档的形式来体现出一对一的关系
db.WifeAndHusband.insert([ { wife:"黄蓉", husband:{ name:"郭靖" } }, { wife:"潘金莲", husband:{ name:"武大郎" } } ])
-
-
一对多(one to many)/ 多对一(many to one)
-
一对多:父母和孩子、用户和订单、文章和评论,也可以通过内嵌文档的方式来映射一对多的关系(将1的那个属性设置为多的里面的字段)
db.order.insert({ list:["watermelor"], user_id:ObjectId("5f87b1deda684b252c2fc7a5") }) var user_id = db.users.findOne({ username:"swk"})._id //查询孙悟空的订单 db.order.find({ user_id:user_id})
-
-
多对多(many to many):分类和商品,通过内嵌文档的方式
db.teacher.insert([ {name:"洪七公"}, {name:"黄药师"}, {name:"龟仙人"} ]) db.stus.insert([ { name:"郭靖", tech_ids:[ ObjectId("5f87b4b6da684b252c2fc7a8"), ObjectId("5f87b4b6da684b252c2fc7a9") ] }, { name:"孙悟空", tech_ids:[ ObjectId("5f87b4b6da684b252c2fc7a8"), ObjectId("5f87b4b6da684b252c2fc7a9"), ObjectId("5f87b4b6da684b252c2fc7aa") ] } ])
12. 练习
//查询工资小于1000或者大于2000的员工
db.emp.find( $or:[ {
sal:{
$lt:1000}},{
sal:{
$gt:2500}} ])
//为所有工资小于1000的增加400
db.emp.find({
sal:{
$lte:1000}}, {
$inc:{
$sal:400}})
13. sort和投影
-
find()查询文档时,默认情况是按照_id的值进行升序排列
-
sort()可以用来指定文档的排序的规则,需要传递一个属性来指定排序规则,1表示升序,-1表示降序
db.users.find({ }).sort({ sale:1}) db.users.find({ }).sort({ sale:1,qq:1}) //先指定sale的升序 再qq的降序
-
limit、skip、sort可以任意顺序的调用
-
查询时,我们可以在第二个参数的位置来设置查询结果的投影
db.users.find({ },{ sale:1})