随笔 - 1162  文章 - 0  评论 - 16  阅读 - 59万 

一、三个概念

数据库(database)

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

集合(collection)

  • 集合类似于数组,在集合中可以存放文档。
  • 集合就是一组文档,也就是集合是用来存放文档的
  • 集合中存储的文档可以是各种各样的,没有格式要求

文档(document)

  • 文档数据库中的最小单位,我们存储和操作的内容都是文档。
  • 类似于JS中的对象,在MongoDB中每一条数据都是一个文档

多个文档组成集合,多个集合组成数据库

二、基本指令

show dbs / show databases:显示当前的所有数据库
use 数据库名:进入到指定的数据库中
db:表示的是当前所处的数据库
show collections:显示数据库中所有的集合

常用操作:

use 数据库名
  – 使用use时,如果数据库存在则会进入到相应的数据库,如果不存在则会自动创建
  – 一旦进入数据库,则可以使用db来引用当前库

db.collection.insert(文档)
  – 向集合中插入文档,如果集合不存在则创建

db.createCollection()
  – 创建一个新的集合

db.collection.drop()
  – 删除集合

在MongoDB中,数据库和集合都不需要手动创建,当我们创建文档时,如果文档所在的集合或数据库不存在会自动创建数据库和集合。

三、数据库的CRUD(增删改查)的操作

1、插入操作

插入方法

db.<collection>.insert() 向集合中插入一个或多个文档
db.<collection>.insertOne() 插入一个文档对象
db.<collection>.insertMany() 插入多个文档对象
  • insert()可以用于向集合中添加一个或多个文档,可以传递一个对象,或一个数组。
  • 添加时如果集合或数据库不存在,会自动创建
  • 当我们向集合中插入文档时,如果没有给文档指定 _id 属性,则数据库会自动为文档添加_id,该属性用来作为文档的唯一标识(根据时间戳生成)
  • _id 可以自己指定,如果我们指定了数据库就不会在添加了,但是自己指定 _id 也必须确保它的唯一性

示例:

test数据库中的,stus集合中插入一个新的学生对象
db.stus.insert({name:"孙悟空",age:18,gender:"男"})

批量插入对象
db.stus.insert([
        {name:"猪八戒", age:26, gender:"男"},
        {name:"师傅", age:20, gender:"男"},
        {name:"沙和尚", age:28, gender:"男"}
]);

2、查询操作

db.collection.find()
可以接受一个对象作为条件参数,用来查询集合中符合条件的文档
查询集合中所有的文档,会返回一个文档数组

db.collection.findOne()
用来查询符合条件的第一个文档,返回一个文档对象

db.collection.find().count()
查询所有结果的数量

示例:

db.stus.find({属性名: 值});
db.stus.find({age: 28, name: "孙悟空"});
db.collection.find().count();

3、更新操作

db.collection.update()
- 参数1:查询条件,查询文档
- 参数2:新的文档,这样符和条件的文档将会被新文档
- 注意:默认情况下会使用新对象替换旧对象,如果需要修改指定的属性,而不是全部替换,需要使用"修改操作符"来完成修改
- update()的第三个参数,用来指定是否使用upsert,默认为false
– update()的第四个参数,用来指定是否同时修改多个文档,默认为false

修改器:
使用update会将整个文档替换,但是大部分情况下我们是不需要这么做的
如果只需要对文档中的一部分进行更新时,可以使用更新修改器来进行
$set 可以用来修改文档中的属性
$unset 可以用来删除文档的指定属性


db.collection.updateMany():同时修改多个符号条件的文档
db.collection.updateOne():修改一个符合条件的文档

示例:

db.stus.update({name:"沙和尚"}, {age:28});  会把新对象覆盖为旧对象
db.stus.update(
  {"_id": ObjectId("621f0ce8eddb4d8043b631ec")},
  {$set: {
        name: "沙和尚1",
        age: "38"
      }
  }
);

update 默认修改一个,使用 multi=true 支持修改多个:

multi属性:可选的。如果设置为true,则更新满足query条件的多个文档。如果设置为false,则更新一个文档。默认值为false

4、删除操作

db.collection.remove()
- 删除一个或多个符合条件的文档(默认情况下会删除多个),必须有条件参数
- 如果只传递一个{}空对象,会清空集合,但性能较差
- {条件对象} 可以根据条件来删除文档,传递的条件的方式和 find() 一样
- 如果 remove() 第二个参数使用 justOne=true,则只会删除一个 

db.collection.deleteOne()删除一个符合条件的文档
db.collection.deleteMany():删除多个符合条件的文档

db.collection.remove({}) 情况集合(性能差)
db.collection.drop(): 清空集合
db.dropDatabase():删除数据库

remove() 只删除一个:

示例:

db.collection.remove({age: 28}, true);

四、其他操作

1、排序

//查询文档时,默认情况是按照 _id 的进行排序(升序)
db.emp.find();

//sort() 可以用来指定文档的排序的规则,
//需要传递一个对象来指定排序规则,1 表示升序,-1表示降序
//limit skip sort 可以任意的顺序进行调用
db.emp.find().sort({sal:-1});
db.emp.find().sort({sal:1, empno: -1});

2、投影

//在查询时,可以在第二个参数位置设置查询结果的投影
//显示哪些字段,1表示显示,0表示不显示
db.emp.find({}, {ename:1, _id:0, sal:1});

五、练习一:

//1.进入my_test数据
use my_test
show dbs

//2.向数据库的user集合中插入一个文档
db.users.insert({
    username: "孙悟空"
});
  
//3.查询user集合中的文档
db.users.find();

//4.向数据库的user集合中插入一个文档
db.users.insert({
    username: "猪八戒"
});
      
//5.查询数据库user集合中的文档
db.users.find();

//6.统计数据库user集合中的文档数量
db.users.find().count();


//7.查询数据库user集合中username为sunwukong的文档
db.users.find({
    username: "孙悟空"
});


//8.向数据库user集合中的username为sunwukong的文档,添加一个address属性,属性值为huaguoshan
db.users.update(
    {username:"孙悟空"},
    {$set: {
        address: "huaguoshan"
    }}
);


//9.使用{username:"tangseng"} 替换 username 为 zhubajie的文档
db.users.update(
    {username:"猪八戒"},
    {username:"tangseng"}
);    
    
    
//10.删除username为sunwukong的文档的address属性
db.users.update(
    {username: "孙悟空"},
    {$unset: {
        address:""
    }}
);


//11.向username为sunwukong的文档中,添加一个hobby:{cities:["beijing","shanghai","shenzhen"] , movies:["sanguo","hero"]}
//MongoDB 的文档的属性值也可以是文档,当一个文档的属性值是一个文档时,我们称这个文档叫做  内嵌文档
db.users.update(
    {username: "孙悟空"},
    {$set:{hobby:{cities:["beijing","shanghai","shenzhen"] , movies:["sanguo","hero"]}}}
);


//12.向username为tangseng的文档中,添加一个hobby:{movies:["A Chinese Odyssey","King of comedy"]}
db.users.update(
    {username: "tangseng"},
    {$set: {hobby:{movies:["A Chinese Odyssey","King of comedy"]}}}
);


//13.查询喜欢电影hero的文档
//MongoDB支持直接通过内嵌文档的属性进行查询,如果要查询的内嵌文档则可以通过. 的形式来匹配
//如果要通过内嵌文档对文档进行查询,属性名必须使用引号
db.users.find({"hobby.movies":"hero"});

//14.向tangseng中添加一个新的电影Interstellar
//$push 用于向数组中添加一个新的元素
//$addToSet 向数组中添加一个新元素,如果数组中已经存在了该元素,则不会添加
db.users.update(
    {username: "tangseng"},
    {$push: {"hobby.movies""Interstellar"}}
);

db.users.update(
    {username: "tangseng"},
    {$addToSet: {"hobby.movies""Interstellar"}}
);

//15.删除喜欢beijing的用户
db.users.remove(
    {"hobby.cities""beijing"}
);

//16.删除user集合
db.users.remove({});
db.users.drop();


db.users.find();
show dbs;


//17.向numbers中插入20000条数据
use numbers;

//耗时,效率低
for (var i = 1; i <= 20000; i++){
    db.numbers.insert({num:i});
}

db.numbers.remove({});
db.numbers.find().count();

//高效
var arr = [];
for (var i = 1; i <= 20000; i++){
    arr.push({num:i});
}

db.numbers.insert(arr);

六、练习二:

use numbers;

//18.查询numbers中num为500的文档
db.numbers.find(
    {num: 500}
);

db.numbers.find(
    {num: {$eq: 5000}}
);

//19.查询numbers中num大于5000的文档
db.numbers.find(
    {num: {$gt: 5000}}
);

//20.查询numbers中num小于30的文档
db.numbers.find(
    {num: {$lt: 30}}
);

//21.查询numbers中num大于40小于50的文档
db.numbers.find(
    {num: {$gt: 40, $lt: 50}}
);


//22.查询numbers中num大于19996的文档
db.numbers.find(
    {num: {$gt: 1996}}
);


//23.查看numbers集合中的前10条数据
//limit() 设置显示数据的上限
db.numbers.find().limit(10);

//24.查看numbers集合中的第11条到20条数据
//skip() 用于跳过指定数量的数据
db.numbers.find().skip(10).limit(10);


//25.查看numbers集合中的第21条到30条数据
// skip((页码-1) * 每页显示的条数).limit(每页显示的条数);

db.numbers.find().skip(20).limit(10);

//MongoDB会自动调整 limit与 skip 的位置
db.numbers.find().limit(10).skip(20);

七、文档之间的关系

  • 一对一(one to one)

    • 在MongoDB 可以通过内嵌文档的形式来体现出一对一的关系
  • 一对多(one to many)/多对一(many to one)

  • 多对多(many to many)

八、测试三:

准备文件:


dept.json
{
  "_id" : ObjectId("5941f2bac1bc86928f4de49a"),
  "deptno" : 10.0,
  "dname" : "财务部",
  "loc" : "北京"
}
{
  "_id" : ObjectId("5941f2bac1bc86928f4de49b"),
  "deptno" : 20.0,
  "dname" : "办公室",
  "loc" : "上海"
}
{
  "_id" : ObjectId("5941f2bac1bc86928f4de49c"),
  "deptno" : 30.0,
  "dname" : "销售部",
  "loc" : "广州"
}
{
  "_id" : ObjectId("5941f2bac1bc86928f4de49d"),
  "deptno" : 40.0,
  "dname" : "运营部",
  "loc" : "深圳"
}


emp.json
{
  "_id" : ObjectId("5941f5bfc1bc86928f4de4ac"),
  "empno" : 7369.0,
  "ename" : "林冲",
  "job" : "职员",
  "mgr" : 7902.0,
  "hiredate" : ISODate("1980-12-16T16:00:00Z"),
  "sal" : 800.0,
  "depno" : 20.0
}
{
  "_id" : ObjectId("5941f5bfc1bc86928f4de4ad"),
  "empno" : 7499.0,
  "ename" : "孙二娘",
  "job" : "销售",
  "mgr" : 7698.0,
  "hiredate" : ISODate("1981-02-19T16:00:00Z"),
  "sal" : 1600.0,
  "comm" : 300.0,
  "depno" : 30.0
}
{
  "_id" : ObjectId("5941f5bfc1bc86928f4de4ae"),
  "empno" : 7521.0,
  "ename" : "扈三娘",
  "job" : "销售",
  "mgr" : 7698.0,
  "hiredate" : ISODate("1981-02-21T16:00:00Z"),
  "sal" : 1250.0,
  "comm" : 500.0,
  "depno" : 30.0
}
{
  "_id" : ObjectId("5941f5bfc1bc86928f4de4af"),
  "empno" : 7566.0,
  "ename" : "卢俊义",
  "job" : "经理",
  "mgr" : 7839.0,
  "hiredate" : ISODate("1981-04-01T16:00:00Z"),
  "sal" : 2975.0,
  "depno" : 20.0
}
{
  "_id" : ObjectId("5941f5bfc1bc86928f4de4b0"),
  "empno" : 7654.0,
  "ename" : "潘金莲",
  "job" : "销售",
  "mgr" : 7698.0,
  "hiredate" : ISODate("1981-09-27T16:00:00Z"),
  "sal" : 1250.0,
  "comm" : 1400.0,
  "depno" : 30.0
}
{
  "_id" : ObjectId("5941f5bfc1bc86928f4de4b1"),
  "empno" : 7698.0,
  "ename" : "西门庆",
  "job" : "经理",
  "mgr" : 7839.0,
  "hiredate" : ISODate("1981-04-30T16:00:00Z"),
  "sal" : 2850.0,
  "depno" : 30.0
}
{
  "_id" : ObjectId("5941f5bfc1bc86928f4de4b2"),
  "empno" : 7782.0,
  "ename" : "柴进",
  "job" : "经理",
  "mgr" : 7839.0,
  "hiredate" : ISODate("1981-06-08T16:00:00Z"),
  "sal" : 2450.0,
  "depno" : 10.0
}
{
  "_id" : ObjectId("5941f5bfc1bc86928f4de4b3"),
  "empno" : 7788.0,
  "ename" : "公孙胜",
  "job" : "分析师",
  "mgr" : 7566.0,
  "hiredate" : ISODate("1987-07-12T16:00:00Z"),
  "sal" : 3000.0,
  "depno" : 20.0
}
{
  "_id" : ObjectId("5941f5bfc1bc86928f4de4b4"),
  "empno" : 7839.0,
  "ename" : "宋江",
  "job" : "董事长",
  "hiredate" : ISODate("1981-11-16T16:00:00Z"),
  "sal" : 5000.0,
  "depno" : 10.0
}
{
  "_id" : ObjectId("5941f5bfc1bc86928f4de4b5"),
  "empno" : 7844.0,
  "ename" : "阎婆惜",
  "job" : "销售",
  "mgr" : 7698.0,
  "hiredate" : ISODate("1981-09-07T16:00:00Z"),
  "sal" : 1500.0,
  "comm" : 0.0,
  "depno" : 30.0
}
{
  "_id" : ObjectId("5941f5bfc1bc86928f4de4b6"),
  "empno" : 7876.0,
  "ename" : "李逵",
  "job" : "职员",
  "mgr" : 7902.0,
  "hiredate" : ISODate("1987-07-12T16:00:00Z"),
  "sal" : 1100.0,
  "depno" : 20.0
}
{
  "_id" : ObjectId("5941f5bfc1bc86928f4de4b7"),
  "empno" : 7900.0,
  "ename" : "武松",
  "job" : "职员",
  "mgr" : 7782.0,
  "hiredate" : ISODate("1981-12-02T16:00:00Z"),
  "sal" : 950.0,
  "depno" : 10.0
}
{
  "_id" : ObjectId("5941f5bfc1bc86928f4de4b8"),
  "empno" : 7902.0,
  "ename" : "吴用",
  "job" : "分析师",
  "mgr" : 7566.0,
  "hiredate" : ISODate("1981-12-02T16:00:00Z"),
  "sal" : 3000.0,
  "depno" : 20.0
}
{
  "_id" : ObjectId("5941f5bfc1bc86928f4de4b9"),
  "empno" : 7934.0,
  "ename" : "鲁智深",
  "job" : "职员",
  "mgr" : 7782.0,
  "hiredate" : ISODate("1982-01-22T16:00:00Z"),
  "sal" : 1300.0,
  "depno" : 10.0
}


测试:

//26.将dept和emp集合导入到数据库中


//27.查询工资小于2000的员工
db.emp.find(
    {sal: {$lt2000}}
);

//28.查询工资在1000-2000之间的员工
db.emp.find(
    {sal: {$lt2000$gt1000}}
);

//29.查询工资小于1000或大于2500的员工
db.emp.find(
    {$or: [{sal:{$lt1000}}, {sal: {$gt2500}}]}
);

//30.查询财务部的所有员工
var deptNo = db.dept.findOne({dname:"财务部"}).deptno;
db.emp.find({depno: deptNo});

//31.查询销售部的所有员工
var deptNo = db.dept.findOne({dname:"销售部"}).deptno;
db.emp.find({depno: deptNo});

//32.查询所有mgr为7698的所有员工
db.emp.find({mgr: 7698});

//33.为所有薪资低于1000的员工增加工资400元
db.emp.find(
    {sal: {$lt1000}}
);

//$inc用来增加已有键的值,或者该键不存在那就创建一个
//$inc只能用于Number类型的值
db.emp.updateMany(
    {sal: {$lte1000}},
    {$inc:{sal: 400}}
);


db.emp.find();
db.dept.find();

 

posted on   格物致知_Tony  阅读(95)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
历史上的今天:
2021-03-06 Java 常用类——String类
2021-03-06 第四节:职责链模式——总结
2021-03-06 第三节:职责链模式——在SpringMVC源码分析
2021-03-06 第二节:职责链模式——基本介绍&应用
2021-03-06 第一节:职责链模式——需求说明&传统实现
2020-03-06 URI、URL 和 URN 的区别
点击右上角即可分享
微信分享提示

目录导航