MongoDB相关基础操作(库、集合、文档)

news2024/11/19 9:39:25

文章目录

  • 一、库的相关操作
    • 1、查看数据库
    • 2、查看当前库
    • 3、创建数据库
    • 4、删除数据库
  • 二、集合的相关操作
    • 1、查看库中所有集合
    • 2、创建集合
      • 2.1、显示创建
      • 2.2、隐式创建
    • 3、删除集合
  • 三、文档的相关操作
    • 1、插入文档
      • 1.1、插入单条文档
      • 1.2、插入多条文档
      • 1.3、脚本方式
    • 2、查询文档
    • 3、删除文档
    • 4、更新文档
    • 5、查询文档
      • 5.1、语法
      • 5.2、对比语法
      • 5.3、AND
      • 5.4、OR
      • 5.5、AND 和 OR 联合
      • 5.6、数组中查询
      • 5.7、模糊查询
      • 5.8、排序
      • 5.9、分页
      • 5.10、总条数
      • 5.11、去重
      • 5.12、指定返回字段
  • 总结


一、库的相关操作

1、查看数据库

查看所有数据库有两种命令:

show databases
或
show dbs

在这里插入图片描述

2、查看当前库

最新版的MongoDB在>的左边已经显示当前的数据库名称了。

db

在这里插入图片描述

3、创建数据库

use命令是创建并使用(如果数据库已经有了则是切换数据库)

use gedeshidai

注意:
MongoDB有一种机制:当数据库中没有数据的时候,命令show dbs不会显示
当输入db的时候,会显示创建的数据(db命令是显示当前使用的数据库)
但是当我们在新建的数据库中插入一条数据后,就能显示出来了。

db.users.insert({name:'gedeshidai'});

在这里插入图片描述
注意:

  • admin:从权限的角度来看,这是" root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
  • local:这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合。
  • conlig :当Mongo用于分片设置时, config数据库在内部使用,用于保存分片的相关信息。

4、删除数据库

默认删除当前数据库

db.dropDatabase()

在这里插入图片描述
虽然已经删除数据库gedeshidai,但是我们当前仍在gedeshidai数据库里面,这点需要注意。这是MongoDB的机制。
在这里插入图片描述

二、集合的相关操作

1、查看库中所有集合

show collections
或
show tables

在这里插入图片描述

2、创建集合

2.1、显示创建

db.createCollection('集合名称',[options])

options可以是如下参数(可选):

字段类型描述
capped布尔(可选)如果为true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为true时,必须指定size参数
size数值(可选)为固定集合指定一个最大值,即字节数。如果capped为true,也需要指定该字段
max数值(可选)指定固定集合中包含文档的最大数量。

在这里插入图片描述

2.2、隐式创建

注意:当集合不存在时,向集合中插入文档也会自动创建该集合
在这里插入图片描述

3、删除集合

db.集合名称.drop();

在这里插入图片描述

三、文档的相关操作

官网地址:https://www.mongodb.com/docs/manual/crud/

1、插入文档

1.1、插入单条文档

db.集合名称.insert(document)
 -- 举例:
db.users.insert({"name":"哥的时代","age":21,"bir":"2023-11-19"});
 ​
 -- db.集合名称.insertOne():向指定集合中插入一条文档数据【推荐使用】
db.users.insertOne({"name":"哥的时代","age":21,"bir":"2023-11-19"});

1.2、插入多条文档

db.collection.insertMany():向指定集合中插入多条文档数据【推荐使用】
db.集合名称.insertMany(
    [ <document 1> , <document 2>, ... ],
    {
       writeConcern: 1,//写入策略,默认为1,即要求确认写操作,0是不要求。
       ordered: true //指定是否按顺序写入,默认true,按顺序写入。
    }
 )
 -- 举例:
db.users.insert([
     {"name":"哥的时代","age":21,"bir":"2023-11-19"},
     {"name":"小黑","age":22,"bir":"2023-11-19"}
 ]);
 或
db.users.insertMany([
     {"name":"哥的时代","age":21,"bir":"2023-11-19"},
     {"name":"小黑","age":22,"bir":"2023-11-19"}
]);

1.3、脚本方式

for(let i=0;i<100;i++){
     db.users.insert({"_id":i,"name":"哥的时代_"+i,"age":21});
 }
 ​
 -- 1、先创建数组
 -- 2、将数据放在数组中
 -- 3、一次 insert 到集合中
 var arr = [];
 for(var i=1 ; i<=20000 ; i++){
     arr.push({num:i});
 }
 db.numbers.insert(arr);

注意:在mongodb中每个文档都会有一个_id作为唯一标识,_id默认会自动生成,如果手动指定将使用手动指定的值作为_id 的值。

2、查询文档

db.集合名称.find();

3、删除文档

 db.集合名称.remove(
    <query>,
    {
      justOne: <boolean>,
      writeConcern: <document>
    }
 )
 -- 由于remove()方法已经过时了,现在官方推荐使用deleteOne()和deleteMany()方法。
db.集合名称.deleteMany({query})  -- 不指定条件时删除集合下全部文档
db.users.deleteMany({});
db.users.deleteMany({age:21});
 ​
db.集合名称.deleteOne({query})  -- 删除一条文档
db.users.deleteOne({_id:ObjectId("65586ebacd3d67eac1aec0d4")});

参数说明:

  • query :可选删除的文档的条件。

  • justOne : 可选如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。

  • writeConcern :可选抛出异常的级别。

注意:文档内容全部删除后,文档仍存在,即删除内容,不删除结构

4、更新文档

db.集合名称.update(
    <query>,
    <update>,
    {
      upsert: <boolean>,
      multi: <boolean>,
      writeConcern: <document>
    }
 );

参数说明:

  • query : update的查询条件,类似sql update查询内where后面的。

  • update : update的对象和一些更新的操作符(如 , , ,inc…)等,也可以理解为sql update查询内set后面的

  • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。

  • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。

  • writeConcern :可选,抛出异常的级别。

    • WriteConcern.NONE:没有异常抛出

    • WriteConcern.NORMAL:仅抛出网络错误异常,没有服务器错误异常

    • WriteConcern.SAFE:抛出网络错误异常、服务器错误异常;并等待服务器完成写操作。

    • WriteConcern.MAJORITY: 抛出网络错误异常、服务器错误异常;并等待一个主服务器完成写操作。

    • WriteConcern.FSYNC_SAFE: 抛出网络错误异常、服务器错误异常;写操作等待服务器将数据刷新到磁盘。

    • WriteConcern.JOURNAL_SAFE:抛出网络错误异常、服务器错误异常;写操作等待服务器提交到磁盘的日志文件。

    • WriteConcern.REPLICAS_SAFE:抛出网络错误异常、服务器错误异常;等待至少2台服务器完成写操作。

  • db.集合名称.update({“name”:“zhangsan”},{name:“11”,bir:new date()})
    这个更新是将符合条件的全部更新成后面的文档,相当于先删除在更新
  • db.集合名称.update({“name”:“xiaohei”},{$set:{name:“mingming”}})
    保留原来数据更新,但是只更新符合条件的第一条数据
  • db.集合名称.update({name:”小黑”},{$set:{name:”小明”}},{multi:true})
    保留原来数据更新,更新符合条件的所有数据
  • db.集合名称.update({name:”小黑”},{$set:{name:”小明”}},{multi:true,upsert:true})
    `保留原来数据更新,更新符合条件的所有数据,没有条件符合时插入数据

注意:在7.x版本的时候update()方法已经不适用了,官网提供了以下方法进行操作:

db.collection.updateOne()
最多更新与指定筛选器匹配的单个文档 即使多个文档可能与指定的筛选器匹配。

db.collection.updateMany()
更新与指定筛选器匹配的所有文档。

db.collection.replaceOne()
最多替换与指定筛选器匹配的单个文档 即使多个文档可能与指定的筛选器匹配。

5、查询文档

MongoDB查询文档使用find()方法。find()方法以非结构化的方式来显示所有文档。

5.1、语法

db.集合名称.find(query, projection)
  • query :可选,使用查询操作符指定查询条件

  • projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。

如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:

db.集合名称.find().pretty()

注意: pretty()方法以格式化的方式来显示所有文档

5.2、对比语法

如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:

操作格式范例RDBMS中的类似语句
等于{:}db.col.find({“by”:“哥的时代”}).pretty()where by = ‘哥的时代’
小于{:{$lt:}}db.col.find({“likes”:{$lt:50}}).pretty()where likes < 50
小于或等于{:{$lte:}}db.col.find({“likes”:{$lte:50}}).pretty()where likes <= 50
大于{:{$gt:}}db.col.find({“likes”:{$gt:50}}).pretty()where likes > 50
大于或等于{:{$gte:}}db.col.find({“likes”:{$gte:50}}).pretty()where likes >= 50
不等于{:{$ne:}}db.col.find({“likes”:{$ne:50}}).pretty()where likes != 50

5.3、AND

db.集合名称.find({key1:value1, key2:value2,...}).pretty()

类似于 WHERE 语句:WHERE key1=value1 AND key2=value2

  • db.users.find({“age”:27,“name”:“哥的时代”,_id:8});

  • db.users.find({“age”:3,“age”:32});同一字段多次出现查询条件时,只有最后的查询条件才生效,即后面会覆盖前面的查询条件

5.4、OR

MongoDB OR 条件语句使用了关键字 $or,语法格式如下:

db.集合名称.find({$or: [{key1: value1}, {key2:value2}]}).pretty()

类似于 WHERE 语句:WHERE key1=value1 or key2=value2

  • db.users.find({$or:[{_id:4},{age:18}]});

5.5、AND 和 OR 联合

类似SQL语句为:‘where age >25 AND (name = ‘哥的时代’ OR name = ‘MongoDB’)’

db.集合名称.find({"age": {$gt:25}, $or: [{"name": "哥的时代"},{"name": "MongoDB"}]}).pretty();
  • db.users.find({age:{KaTeX parse error: Expected 'EOF', got '}' at position 6: gt:15}̲,or:[{_id:3},{age:15}]});

5.6、数组中查询

-- 测试数据
db.集合名称.insert({ "_id" : 11, "age" : 29, "likes" : [ "看电视", "读书xx", "美女" ], "name" : "哥的时代_xx_11" })
 -- 执行数组查询
 > db.users.find({likes:"看电视"})
 -- $size 按照数组长度查询
 > db.users.find({likes:{$size:3}});

5.7、模糊查询

类似 SQL 中为 ‘where name like ‘%name%’’

db.users.find({likes:/哥/});

注意:在 mongoDB 中使用正则表达式可以是实现近似模糊查询功能

5.8、排序

db.集合名称.find().sort({name:1,age:1})
- 1 升序  -1 降序

类似 SQL 语句为: ‘order by name,age’

5.9、分页

db.集合名称.find().sort({条件}).skip(start).limit(rows);

类似于 SQL 语句为: ‘limit start,rows’

5.10、总条数

db.集合名称.count();
db.集合名称.find({"name":"哥的时代"}).count();

类似于 SQL 语句为: ‘select count(id) from …’

DeprecationWarning: Collection.count() is deprecated. Use countDocuments or estimatedDocumentCount.

  • db.users.countDocuments();

  • db.users.estimatedDocumentCount();

5.11、去重

db.集合名称.distinct('字段')

类似于 SQL 语句为: ‘select distinct name from …’

  • db.users.distinct(“age”);

5.12、指定返回字段

db.集合名称.find({条件},{name:1,age:1}) 
- 参数2: 1 返回  0 不返回  
  • db.users.find({},{“name”:1});查询所有,返回指定字段

  • db.users.find({age:{$lt:17}},{name:1});按照指定条件查询,返回指定字段

  • db.users.find({age:{$lt:17}},{_id:0,name:1});按照指定条件查询,返回指定字段,不返回id,注意id是唯一索引


总结

以上就是MongoDB相关基础操作(库、集合、文档)的知识点,希望对你有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1225989.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电商平台革新:食派士小程序的无代码开发与广告推广集成

食派士小程序&#xff1a;无代码开发的连接神器 食派士小程序&#xff0c;作为上海食派士商贸发展有限公司的专利产品&#xff0c;是一种凭借无代码开发&#xff0c;就能实现与各种系统的连接和集成的电商解决方案。它采用无代码开发的方式&#xff0c;避免了API开发的复杂过程…

原型网络Prototypical Network的python代码逐行解释,新手小白也可学会!!-----系列8

文章目录 前言一、原始代码二、对每一行代码的解释&#xff1a;总结 前言 这是该系列原型网络的最后一段代码及其详细解释&#xff0c;感谢各位的阅读&#xff01; 一、原始代码 if __name__ __main__:##载入数据labels_trainData, labels_testData load_data() # labels_…

常见树种(贵州省):001松类

摘要&#xff1a;本专栏树种介绍图片来源于PPBC中国植物图像库&#xff08;下附网址&#xff09;&#xff0c;本文整理仅做交流学习使用&#xff0c;同时便于查找&#xff0c;如有侵权请联系删除。 图片网址&#xff1a;PPBC中国植物图像库——最大的植物分类图片库 一、华山松…

麻将馆电脑计费系统,棋牌室怎么用电脑控制灯计时,佳易王计时计费系统软件下载

麻将馆电脑计费系统&#xff0c;棋牌室怎么用电脑控制灯计时&#xff0c;佳易王计时计费系统软件下 棋牌室电脑灯控系统&#xff0c;需要安装一个灯控器&#xff0c;软件发出开灯和关灯的指令&#xff0c;相应的灯就打开或关闭。在点击开始计时的时候&#xff0c;开灯&#xff…

黔院长 | 为什么要调经络?原来通经络对人体健康如此重要!

人体的组成较为复杂&#xff0c;在外有皮肤、毛发&#xff1b;在内有经络、五脏&#xff1b;其他还有我们看不到的精气、津液等等&#xff0c;也因此人体会生各种各样的疾病。 为什么说经络畅通对人体健康如此重要&#xff1f;身体内外始终是一个统一的整体&#xff0c;内外之间…

vue3基础学习

##以前怎么玩的? ###MVC Model:Bean View:视图 Controller ##vue的ref reactive ref:必须是简单类型 reactive:必须不能是简单类型 ###创建一个Vue项目 npm init vuelatest ###生命周期 ###setup相关 ####Vue2的一些写法 -- options API ####Vue3的写法 组合式API Vu…

Python —— Mock接口测试

前言 今天跟小伙伴们一起来学习一下如何编写Python脚本进行mock测试。 什么是mock? 测试桩&#xff0c;模拟被测对象的返回&#xff0c;用于测试 通常意义的mock指的就是mock server, 模拟服务端返回的接口数据&#xff0c;用于前端开发&#xff0c;第三方接口联调 为什么…

数据结构与算法-哈夫曼树与图

&#x1f31e; “永远积极向上&#xff0c;永远豪情满怀&#xff0c;永远热泪盈眶&#xff01;” 哈夫曼树与图 &#x1f388;1.哈夫曼树&#x1f52d;1.1树与二叉树的转换&#x1f52d;1.2森林与二叉树的转换&#x1f52d;1.3哈夫曼树&#x1f50e;1.3.1哈夫曼树的概念&#x…

大数据HCIE成神之路之数学(2)——线性代数

线性代数 1.1 线性代数内容介绍1.1.1 线性代数介绍1.1.2 代码实现介绍 1.2 线性代数实现1.2.1 reshape运算1.2.2 转置实现1.2.3 矩阵乘法实现1.2.4 矩阵对应运算1.2.5 逆矩阵实现1.2.6 特征值与特征向量1.2.7 求行列式1.2.8 奇异值分解实现1.2.9 线性方程组求解 1.1 线性代数内…

基于STM32单片机数字电压表自动切换量程及源程序

一、系统方案 1、本设计采用这STM32单片机作为主控器。 2、液晶1602显示。 3、内部ADC采集电压0-12V&#xff0c;自动切换档位。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 u8 i; u16 a,b,c,d; u16 adcx; float adc; unsigned char datas…

AIGC实战 - 使用变分自编码器生成面部图像

AIGC实战 - 使用变分自编码器生成面部图像 0. 前言1. 数据集分析2. 训练变分自编码器2.1 变分自编码器架构2.2 变分自编码器分析 3. 生成新的面部图像4. 潜空间算术5. 人脸变换小结系列链接 0. 前言 在自编码器和变分自编码器上&#xff0c;我们都仅使用具有两个维度的潜空间。…

Alien Skin Exposure2024免费版图片颜色滤镜插件

Alien Skin Exposure一款非常专业的图片后期处理软件&#xff0c;内含500多种照片滤镜。是一款图片后期处理功能非常强大的软件。这款软件可以对图片的后期效果做很好的处理。 打开Alien Skin Exposure软件&#xff0c;会显示下面这个界面&#xff0c;如图1. ExposureX8win-安…

爱奇艺大数据离在线混部

混部作为一种提高资源利用率、降低成本的的方案&#xff0c;被业界普遍认可。爱奇艺在云原生化与降本增效的过程中&#xff0c;成功将大数据离线计算、音视频内容处理等工作负载与在线业务进行了混部&#xff0c;并且取得了阶段性收益。本文重点以大数据为例&#xff0c;介绍从…

图解API设计风格,看一眼就忘不了了!

点击下方“JavaEdge”&#xff0c;选择“设为星标” 第一时间关注技术干货&#xff01; 免责声明~ 任何文章不要过度深思&#xff01; 万事万物都经不起审视&#xff0c;因为世上没有同样的成长环境&#xff0c;也没有同样的认知水平&#xff0c;更「没有适用于所有人的解决方案…

反弹Shell

概述 反弹shell&#xff08;reverse shell&#xff09;就是控制端监听在某TCP/UDP端口&#xff0c;被控端发起请求到该端口&#xff0c;并将其命令行的输入输出转到控制端。reverse shell与telnet&#xff0c;ssh等标准shell对应&#xff0c;本质上是网络概念的客户端与服务端…

原型网络Prototypical Network的python代码逐行解释,新手小白也可学会!!-----系列7(承接系列6)

文章目录 前言一、原始代码---保存原型点,加载原型点二、代码逐行解释 前言 此部分为原型网络的两个函数&#xff0c;分别为保存原型点函数和加载原型点函数&#xff0c;与之前的系列相承接。 一、原始代码—保存原型点,加载原型点 def save_center(self,path):datas []for …

C/C++ 获取主机网卡MAC地址

MAC地址&#xff08;Media Access Control address&#xff09;&#xff0c;又称为物理地址或硬件地址&#xff0c;是网络适配器&#xff08;网卡&#xff09;在制造时被分配的全球唯一的48位地址。这个地址是数据链路层&#xff08;OSI模型的第二层&#xff09;的一部分&#…

端口号大揭秘:网络世界的“门牌号”有多牛?

大家好&#xff0c;今天我们来聊一聊网络中的端口号。如果你以为端口号只是冷冰冰的数字&#xff0c;那你就大错特错了。端口号&#xff0c;这些看似枯燥的数字背后&#xff0c;隐藏着一个个生动的故事。 目录 大家好&#xff0c;今天我们来聊一聊网络中的端口号。如果你以为端…

odoo17前端js框架的演化

odoo17发布了&#xff0c;从界面上看&#xff0c;变化还是很明显的&#xff0c;比16更漂亮了&#xff0c;本来以为源码不会发生太大的变化&#xff0c;结果仔细一瞧&#xff0c;变化也不小。 1、打包好的文件数量和大小发生了变化 打包好的文件从两个变成了一个&#xff0c;在…

适用于全部安卓手机的 5 大免费 Android 数据恢复

您是否面临这样一种情况&#xff0c;即在Android设备上丢失了一些重要文件&#xff0c;但不知道应该选择哪种Android数据恢复来取回它们&#xff1f; 如果您以前从未备份过Android数据&#xff0c;则很难解决问题。 本文将介绍排名前5位的免费Android数据恢复软件。 您可以获…