尚硅谷MongoDB入门--学习笔记(操作篇)


一、创建数据库

1、use 数据库名
使用use时,如果数据库存在则会进入到相应的数
据库,如果不存在则会自动创建
一旦进入数据库,则可以使用db来引用当前库
2、db.collection.insert(文档)
向集合中插入文档,如果集合不存在则创建
3、db.createCollection()
创建一个新的集合
4、db.collection.drop()
删除集合

二、

1、插入文档

doc:文档或文档数组
<1>

db.collection.insert(doc)
  • insert()可以向集合中插入一个或多个文档,分别是传递一个对象,或一个数组。
  • 可以将对象或数组中的对象添加进集合中。
  • 添加时如果集合或数据库不存在,会自动创建。
  • 插入的文档对象会默认添加_id属性,这个属性对应一个唯一的id,是文档的唯一标识。默认会由根据时间戳和机器码生成的ObjectId()来充当,目的就是确保数据唯一性,可以在插入的时候加入_id属性来自己进行添加,而且自己指定也必须确保唯一性.

<2>

db.collection.insertOne(doc)
  • 向集合中插入一个文档

<3>

db.collection.insertMany(doc)
  • 向集合中插入多个文档

例子:

db.stus.insert({name:"猪八戒",age:28,gender:"男"});

db.stus.insert([
    {name:"沙和尚",age:38,gender:"男"},
    {name:"白骨精",age:16,gender:"女"},
    {name:"蜘蛛精",age:14,gender:"女"}
]);

db.stus.insert({_id:"hello",name:"猪八戒",age:28,gender:"男"});

2、查询文档

condition:查询条件
<1>

db.collection.find()

等同于

 db.collection.find({})
  • find()用来查询集合中所有符合条件的文档
  • find()可以接收一个对象作为条件参数
    { }:表示所有文档
    { 属性:值 }:查询属性是指定值的文档
  • 可以根据指定条件从集合中查询所有符合条件的文档
  • 返回的是一个数组

<2>

db.collection.findOne(condition)
  • 查询第一个符合条件的文档
  • 返回的是一个文档对象

<3>

db.collection.find(condition).count()
  • 查询符合条件的文档的数量

例子:

db.stus.find({_id:"hello"});
db.stus.find({age:16 , name:"白骨精"});
db.stus.find({age:28});
db.stus.findOne({age:28});

db.stus.find({}).count();

3、修改文档

condition:条件,new object:新的对象
<1>

db.collection.update({condition},{new object})
  • 可以修改、替换集合中的一个或多个文档
  • update()默认情况下会使用新对象来替换旧的对象
    如果需要修改指定的属性,而不是替换需要使用“修改操作符”来完成修改
    $set 可以用来修改文档中的指定属性
    $unset 可以用来删除文档的指定属性
  • update()默认只会修改一个,即当有多个文档满足条件的时候,只会修改第一个匹配到的文档。若想修改多个,可以加入multi属性,即multi:true即可把匹配到的全部修改。

<2>

db.collection.updateOne({condition},{new object})
  • 修改集合中的一个文档

<3>

db.collection.updateMany({condition},{new object})
  • 修改集合中的多个文档

<4>

db.collection.replaceOne()
  • 替换集合中的一个文档

例子:

//替换
db.stus.update({name:"沙和尚"},{age:28});

db.stus.update(
    {"_id" : ObjectId("59c219689410bc1dbecc0709")},
    {$set:{
        gender:"男",
        address:"流沙河"
    }}    
)

db.stus.update(
    {"_id" : ObjectId("59c219689410bc1dbecc0709")},
    {$unset:{
        address:1
    }}    
)

db.stus.updateMany(
    {"name" : "猪八戒"},
    {
        $set:{
            address:"猪老庄"
        }
    }    
);
    
db.stus.update(
    {"name" : "猪八戒"},
    
    {
        $set:{
        address:"呵呵呵"
        }
    }  ,
    {
        multi:true
    }    
)

注意:在新版本中update方法已经被弃用了,大家想要修改数据可以使用updateOne()或者updateMany()或者直接使用文档名.属性名的方式修改

4、删除文档

condition:条件
1、删除集合中的文档
<1>

db.collection.remove(condition)
  • remove()可以根据条件来删除文档,传递的条件和方式和find()一样
  • remove函数必须传参,否则运行会报错,可以传递{}表示空对象
  • 删除集合中的一个或多个文档(默认删除多个),可以第二个参数传递一个true,则只会删除一个
  • 如果传递一个空对象作为参数,则会删除所有的

<2>

db.collection.deleteOne(condition)
  • 删除集合中的一个文档

<3>

db.collection.deleteMany(condition)
  • 删除集合中的多个文档

2、清空一个集合

db.collection.remove({})

注意,这样清空集合的性能是略差的,它是通过匹配一个一个的文档,一个一个的删除,选择直接把集合删除会更好

3、删除一个集合

db.collection.drop()

4、删除一个数据库

db.dropDatabase()

注意:一般数据库中的数据都不会删除,所以删除的方法很少调用, 一般会在数据中添加一个字段,来表示数据是否被删除,此外,当一个数据库只有一个集合,一个集合只有一个数据时,如果将该数据删除,集合就会因最后一个文档的删除而被删除,而数据库也会因最后一个集合的删除而被删除。

一般真正使用时的例子:以下isDel的0表示没有删除,1表示已经被删除

db.stus.insert([
    
    {
        name:"zbj",
        isDel:0
        },
        {
        name:"shs",
        isDel:0
        },
    {
    name:"ts",
        isDel:0
    }

]);

db.stus.updateOne({name:"ts"},{$set:{isDel:1}});
    
db.stus.find({isDel:0}) 

三、练习

1、练习一

//1.进入my_test数据库
use my_test

//2.向数据库的user集合中插入一个文档  
db.users.insert({
    username:"sunwukong"
});

//3.查询user集合中的文档
db.users.find();

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

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

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

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


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


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

//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"}});
db.users.find();

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

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

show dbs;

//17.向numbers中插入20000条数据 7.2s
for(var i=1 ; i<=20000 ; i++){
    db.numbers.insert({num:i});
}

db.numbers.find()

db.numbers.remove({});


//0.4s
var arr = [];

for(var i=1 ; i<=20000 ; i++){
    arr.push({num:i});
}

db.numbers.insert(arr);

2、练习二

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

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

//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:19996}});

//23.查看numbers集合中的前10条数据
db.numbers.find({num:{$lte:10}});

//limit()设置显示数据的上限
db.numbers.find().limit(10);
//在开发时,我们绝对不会执行不带条件的查询
db.numbers.find();

//24.查看numbers集合中的第11条到20条数据
/*
    分页 每页显示10条
        1-10     0
        11-20    10
        21-30    20
        。。。
        
        skip((页码-1) * 每页显示的条数).limit(每页显示的条数);
        
    skip()用于跳过指定数量的数据    
    
    MongoDB会自动调整skip和limit的位置
*/
db.numbers.find().skip(10).limit(10);

//25.查看numbers集合中的第21条到30条数据
db.numbers.find().skip(20).limit(10);

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

3、练习三

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

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

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

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

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

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

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

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

4、文档间的关系

<1>一对一(one to one)

  • 夫妻 (一个丈夫 对应 一个妻子)
  • 在MongoDB,可以通过内嵌文档的形式来体现出一对一的关系

例子:

*/一对一
db.wifeAndHusband.insert([
    {
        name:"黄蓉",
        husband:{
            name:"郭靖"
        }
    },{
        name:"潘金莲",
        husband:{
            name:"武大郎"
        }
    }

]);

db.wifeAndHusband.find();

<2>一对多(one to many)/多对一(many to one)

  • 父母 - 孩子
    用户 - 订单
    文章 - 评论
  • 也可以通过内嵌文档来映射一对多的关系

例子:

//一对多 用户(users) 和 订单(orders)
db.users.insert([{
    username:"swk"
    },{
    username:"zbj"
}]);

db.order.insert({
    
    list:["牛肉","漫画"],
    user_id: ObjectId("59c47e35241d8d36a1d50de0")
    
});

db.users.find()
db.order.find()

//查找用户swk的订单
var user_id = db.users.findOne({username:"zbj"})._id;
db.order.find({user_id:user_id});

<3>多对多(many to many)

  • 分类 - 商品
    老师 - 学生

例子:

//多对多
db.teachers.insert([
    {name:"洪七公"},
    {name:"黄药师"},
    {name:"龟仙人"}
]);

db.stus.insert([
    {
        name:"郭靖",
        tech_ids:[
            ObjectId("59c4806d241d8d36a1d50de4"),
            ObjectId("59c4806d241d8d36a1d50de5")
        ]
    },{
        name:"孙悟空",
        tech_ids:[
            ObjectId("59c4806d241d8d36a1d50de4"),
            ObjectId("59c4806d241d8d36a1d50de5"),
            ObjectId("59c4806d241d8d36a1d50de6")
        ]
    }
])

db.teachers.find()

db.stus.find()

四、查询时常用的方法

<1> limit(number)
该方法用于分页查询,number为查询的数据的个数。

例子:查询10条数据

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

<2> skip(number)
该方法用于将数据分割,一般配合limit方法实现分页查询,number为分割的位置。

例子:查询第11条数据到第20条数据

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

<3> sort(condition)
该方法用于对查询的结果进行排序。
condition为排序的条件,是一个对象,如{number:-1},number为根据number这个属性进行排序,1为升序排序,-1为降序排序。可以同时指定多个排序规则。

例子:根据number列进行降序排序,如果number列出现相同则按照sal列升序排序。

db.test.find().sort({number:-1},{sal:1});

<4>投影
find方法默认的查询结果是显示全部数据,可以通过设置find函数的第二个参数来进行投影。
例子:

db.test.find({},{number:1,_id:0});

如该例子所示,显示number列,隐藏_id列。后面的值为是否显示,1为显示,0为不显示。
注:_id列默认是显示的。

五、$操作符表达式表

操作符 功能
$eq 匹配等于(=)指定值的文档
$gt 匹配大于(>)指定值的文档
$gte 匹配大于(>)指定值的文档
$lt 匹配小于(<)指定值的文档
$lte 匹配小于等于(<=)指定值的文档
$ne 匹配不等于(≠)指定值的文档
$in 匹配数组中的任一值
$nin 不匹配数组中的值
$or 或 条件查询
$and 与 条件查询
$not 查询与表达式不匹配的文档
$nor 查询与任一表达式都不匹配的文档
$exists 查询存在指定字段的文档
$type 查询类型为指定类型的文档
$mod 取余条件查询
$regex 正则表达式查询
$text 文本索引查询
$all 匹配文档的数组字段中包含所有指定元素的文档
$elemMatch(query) 匹配内嵌文档或数组中的部分field
$size 匹配数组长度为指定大小的文档
$inc 将文档中的某个field对应的value自增/减某个数字amount
$mul 将文档中的某个field对于的value做乘法操作
$rename 重命名文档中的指定字段的名
$setOnInsert 配合upsert操作,在作为insert时可以为新文档扩展更多的field
$set 更新文档中的某一个字段,而不是全部替换
$unset 删除文档中的指定字段,若字段不存在则不操作
$min 将文档中的某字段与指定值作比较,如果原值小于指定值,则不更新;若大于指定值,则更新
$max 与$min功能相反
$currentDate 设置指定字段为当前时间
$addToSet 用于添加一个元素到array中,一般用于update
$pop 删除数组中的第一个或最后一个元素,-1表示第一个,没错,第一个;1表示最后一个!
$pullAll 删除数组或内嵌文档字段中所有指定的元素
$pull 删除满足条件的元素
$push 往数组中追加指定的元素,若文档中数组不存在,则创建并添加指定元素,自v2.4起,添加了对$.each的支持
$each 需要搭配 addToSet或addToSet或push方可使用
$sort 配合$push使用,表示给文档中的指定数组元素排序,1是升序,-1是降序
$position 配合$push使用表示往数组元素中的指定位置插入元素

其他内容可以查询官网:
MongoDB官网:https://www.mongodb.com/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340