《MongoDB》Mongo Shell中基本操作-ObjectId和文档创建详解

2023-05-16

前端博主,热衷各种前端向的骚操作,经常想到哪就写到哪,如果有感兴趣的技术和前端效果可以留言~博主看到后会去代替大家踩坑的~
主页: oliver尹的主页
格言: 跌倒了爬起来就好~
来个关注吧,点个赞吧,谢谢

《MongoDB》Mongo Shell中基本操作-ObjectId和文档创建详解

  • 一、简介
  • 二、内容概述
  • 三、文档主键 _id
    • 3.1 通过ObjectId获取时间信息
    • 3.2 将ObjectId转成字符串
  • 四、数据库操作
    • 4.1 数据库
    • 4.2 显示数据库中的文档集合
  • 五、创建文档
    • 5.1 db.collection.insertOne()
    • 5.2 db.collection.insertMany()
    • 5.3 db.collection.insert()
    • 5.4 db.collection.save()
  • 六、小结

一、简介

本篇记录备份的是Mongo DB的一些基础知识,包括文档长什么样子,Mongo Shell中的CRUD这四种基本操作,什么是CRUD?C(Creadt、创建)R(Read、读取)U(Update、更新)D(Delete、删除),人话就是增、删、改、查等等;
注意,本文中的示例命令都是基于Mongo Shell的,并不是直接运行在类似于node代码中的~

二、内容概述

本文主要分享的内容是什么是文档主键,以及如何通过insertOne(),insertMany(),insert(),save()命令创建文档,具体内容如下:
在这里插入图片描述

三、文档主键 _id

MongoDB中每一个文档都有一个自己独一无二的主键,这个和传统的关系型数据库没有区别,当然,在不设定的情况下文档的主键是MongoDB自动生成的,这种默认主键也是我们日常开发中最常用的,称作为 对象主键 也就是 ObjectId,看个例子,大概就是长这个样子:

{
	_id: new ObjectId("620327ed5a4fe9fe824daa24"),
	username: "demo"
}

在这里插入图片描述
第一个问题来了,这个文档主键有什么用?

  • 第一个作用就是用于 区分文档,举个例子,比如有两条数据一摸一样,所有字段的值均相同,当然实际情况肯定不会这么干,如果真有这种情况,那么就要考虑是不是代码有问题了,这里只是假设,如果两条数据一摸一样,怎么区分哪条是哪条,这个时候主键的作用就出来了,它是具有 唯一性 的,能为文档做出区分;
  • 第二个作用是为了 索引,这个我们后面再说,_id这个字段将自动编入索引,通过索引,在大数据量的时候可以快速的帮助我们查询到我们需要的数据,提高查询效率;其次,这个ObjectId,它是有意义的,长度为12个字节,其中 前四个字节代表的是文档的创建时间,如果我们想通过ObjectId获取时间信息,那么我们可以这么做:

3.1 通过ObjectId获取时间信息

new ObjectId("620327ed5a4fe9fe824daa24").getTimestamp()

以node为例,我们假设这个admin就是最终查询到的数据,那么我们只需要这么写即可

admin._id.getTimestamp()

最终会得到一个类似于这种值的结果

2022-02-09T02:33:17.000Z

也就是说正常情况下,其实我们没有必要存储当前这条数据的录入时间,这个录入时间完全可以通过ObjectId来获取,当然,这个也是需要根据写的时候的实际情况来看的~

3.2 将ObjectId转成字符串

在某些场景下,可能会说我需要 将ObjectId转成字符串,那么可以通过如下方式获取

new ObjectId("620327ed5a4fe9fe824daa24").valueOf()

以node为例,我们假设这个admin就是最终查询到的数据,那么我们只需要这么写即可

admin._id.valueOf()

最终会得到一个类似于这种值的结果

620327ed5a4fe9fe824daa24

四、数据库操作

4.1 数据库

在Mongo Shell中通过命令 use 切换数据库,比如

use test

得到结果如下
在这里插入图片描述

这代表在当前的Mongo Shell中已经切换到数据库test了,如果不存在test数据库,那么会创建一个名为test的数据库并且切换到test数据库

4.2 显示数据库中的文档集合

使用 show collections 可以查看当前数据库中的数据

show collections

如果提示:Warning: unable to run listCollections, attempting to approximate collection names by parsing connectionStatus,代表权限不够,需要首先登陆

五、创建文档

5.1 db.collection.insertOne()

创建单个文档,具体模版如下:

db.<collection>.inserOne(
  <document>,
    {
      writeConcern:<document>
    }
)
  • collection: 代表集合的名字;
  • document: 要添加的文档;
  • writeConcern: 这个是安全写的级别,简单的说 安全写级别用来代表一次数据库写入操作这个过程的安全级别级别越高,丢失数据的风险就越低代价是写入的操作越慢,因此有利有弊,如果不写,mongoDB使用默认的安全写级别,一般情况下,默认级别就够了;

以上方的这个模版为例,看一个具体的示例:

db.test.insertOne({
	name:"oliver",
	age:18,
})

简单说明:在test这个集合中写入了一条数据,这条数据有两个字段,分别是 nameage,值分别为oliver18;注意的是,在保存数据的时候,MongoDB会自动帮我们生成一个 主键_id 添加进我们待存储的这个文档一起存进test;

5.2 db.collection.insertMany()

创建多个文档,举个例子,假设现在前端传递了一组数据,共10条道后端,如果使用insertOne,那么我们需要执行10次,肯定不合理,因此需要一次性存储10条进集合,模版如下:

db.<collection>insertMany(
  	[<document1>,<document2>,...,<document10>],
    {
      writeConcern:<document>,
      ordered:<bnoolean>
    }
)
  • collection: 代表集合的名字;
  • [document1,document2,…,document10]: 要添加的文档,与insertOne不同,该参数为一个数组,数组的每一项是一个待添加的文档;
  • writeConcern: 这个是安全写的级别,与insertOne一致;
  • ordered: 是否按顺序写入文档,默认为true,如果设置成false,那么将允许MongoDB打乱文档顺序写入,以便优化写入性能;
db.test.insertMany([
{
	name:"oliver",
	age:18,
},{
	name:"oliver1",
	age:19,
}
])

值得注意的是,在顺序写入的状态下,一旦发生错误,那么后续的数据将会被终止写入,在报错信息中,我们可以通过 nInserted这个字段观察最终写入的结果,存在几篇文档写入成功
在这里插入图片描述

如图所示,0,代表在顺序写入的情况下,第一篇就报错了,或者打乱顺序的情况下,所有数据都没有写入成功~

5.3 db.collection.insert()

创建单个或者多个文档,简单的说就是 **insertOne **和 **insertMany **的集合;

db.<collection>insertMany(
  	<document or array of document>,
    {
      writeConcern:<document>,
      ordered:<bnoolean>
    }
)
  • collection: 代表集合的名字;
  • document or array of document: 要添加的文档,可以是一个对象,或者是一个数组;
  • writeConcern: 这个是安全写的级别,与insertOne一致;
  • ordered: 是否按顺序写入文档,默认为true,如果设置成false,那么将允许MongoDB打乱文档顺序写入,以便优化写入性能;

具体示例如下

// 多个
db.test.insert([
{
	name:"oliver",
	age:18,
},{
	name:"oliver1",
	age:19,
}
])

// 单个
db.test.insert({
	name:"oliver",
	age:18,
})

用法就是 insertOneinsertMany 的用法;

5.4 db.collection.save()

这个方法也是用来创建文档的,基本用法如下:

db.<collection>.save(
  <document>,
    {
      writeConcern:<document>
    }
)

这个命令它 本身是调用insert这个方法,db.collection.save()和db.collection.insert()在某种程度上可以是为完全相同,因此不多做介绍了~

六、小结

本文主要记录了什么是文档主键,以及在常规数据库操作中文档创建的一些用法~在日常开发中文档创建用的最多的还是 db.collection.insert() 毕竟它既可以创建单个文档,也可以添加多个文档,当然具体还是根据自己的习惯与喜好进行选择~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《MongoDB》Mongo Shell中基本操作-ObjectId和文档创建详解 的相关文章

  • 在 MongoDB 中查找 7 天前的记录

    我有一个包含对象的集合 如下所示 1 id ObjectId 551c6605e4c6ac495c923aab sender id ObjectId 551c6605e4c6ac495c923aac rep sender id 38 sen
  • Linux find 命令权限被拒绝

    我想过滤掉不必要的信息 权限被拒绝 这些是命令 的输出find type f name sources list find run lxcfs Permission denied find run sudo Permission denie
  • 拼写检查 shell 脚本

    我有一些疑问 我对一个应该是简单拼写检查器的脚本有疑问 它的目的是 当发现错误的单词时 它会提示用户输入该单词的正确拼写 如果用户输入正确的拼写 则会显示更正的单词以及错误的单词 下面 在读完所有单词之后 但是 如果用户只是按 Enter
  • Mongodb upsert 嵌入文档

    我每天每米有一份文件 如果它不存在 如何在数据数组中添加另一个子文档并创建整个文档 key 20120418 123456789 data Meter 123456789 Dt ISODate 2011 12 29T16 00 00 0Z
  • 如何 grep 文件中不区分大小写的字符串?

    我有一个文件file1其结尾为Success OR success 我想要grep为了这个词success以一种不区分大小写的方式 我写了以下命令 但它区分大小写 cat file1 grep success 我怎样才能改变它 以便它ret
  • Linux shell 根据第二列对文件进行排序?

    我有一个这样的文件 FirstName FamilyName Address PhoneNumber 如何按 FamilyName 排序 如果这是 UNIX sort k 2 file txt 您可以使用多个 k用于对多列进行排序的标志 例
  • Windows 7 机器上的 MongoDB:无法建立连接

    在 Windows 7 机器上使用 mongod exe 启动 Mongo 后 我尝试启动 mongo shell 但失败并出现以下错误 无法连接到 127 0 0 1 27017 原因 errno 10061 否 由于目标机器主动拒绝而无
  • Mongoose嵌入式文档更新

    我在嵌入式文档更新方面遇到问题 我定义的架构 var Talk new Schema title type String required true content type String required true date type D
  • python等待shell命令完成

    我正在运行脚本来解压缩一些文件 然后删除 rar 文件 我通过 shell 运行命令来完成此操作 我尝试了几种不同的方法来让脚本等待文件解压完成 但它仍然继续并在文件使用完成之前删除文件 我已经尝试过下面的代码 这是行不通的 我试图看看是否
  • Mongodb 聚合嵌套组以及最近更新的文档

    我已经在我的集合中指定了人员 状态 如下所示 ASSIGN ID 583f84bce58725f76b322398 SPEC ID 58411771 STATUS 1 UPDATE DATE ISODate 2016 12 21T04 10
  • system 和 shell_exec 之间的区别

    有什么区别shell exec and systemPHP 中的方法 两者都采用单个命令行参数并在 PHP 中运行 使用其中一种比另一种更好吗 请参阅此处的解释 http chipmunkninja com Program Executio
  • 如何并行执行4个shell脚本,我不能使用GNU并行?

    我有4个shell脚本dog sh bird sh cow sh和fox sh 每个文件使用 xargs 并行执行 4 个 wget 来派生一个单独的进程 现在我希望这些脚本本身能够并行执行 由于某些我不知道的可移植性原因 我无法使用 GN
  • Python 脚本:每次打印新行到 shell,而不是更新现有行

    说到Python 我是个菜鸟 我有一个 python 脚本 它给我这样的输出 last ZVZX W3vo9I Downloading video webpage last ZVZX W3vo9I Extracting video info
  • 类似 jq 中的 sql join

    我有以下 json id 1 type folder title folder 1 id 2 type folder title folder 2 id 3 type item title item 1 folder 1 id 4 type
  • PHP 中的 MongoDB - 如何将项目插入集合中的数组中?

    这必须很容易 但我似乎无法弄清楚 假设我有一个集合users这是集合中的第一项 id ObjectId 4d8653c027d02a6437bc89ca name Oscar Godson email email protected cdn
  • 在压缩存档内的文本文件上运行“head”,而不解压存档

    问候 我接手了之前的团队并编写了处理 csv 文件的 ETL 作业 我在 ubuntu 上结合使用 shell 脚本和 perl csv 文件很大 它们以压缩档案形式到达 解压后 很多都超过 30Gb 是的 那是 G 旧进程是在 cron
  • 在 bash 中添加(收集)退出代码

    我需要依赖于脚本中的几个单独的执行 并且不想将它们全部捆绑在一个丑陋的 if 语句中 我想使用退出代码 每次执行并添加它 最后 如果这个值超过阈值 我想执行一个命令 伪代码 ALLOWEDERROR 5 run something RESU
  • 在 MongoDB 聚合的“addField”操作中使用“$count”

    我正在尝试找到聚合运算符的正确组合 以将标题为 totalCount 的字段添加到我的 mongoDB 视图中 这将为我提供聚合管道特定阶段的计数 并将其输出为每个文档的计数结果 count count 但最终我得到了一个具有此结果的文档
  • Mongoose 独特的验证不起作用。保存重复条目

    我正在开发一个 NodeJS 应用程序 其中express是框架 MongoDB是数据库 我正在使用猫鼬插件 我有一个父母模型 我已经添加了独特 真实到场 mobile 但是每当我添加相同的手机号码时 唯一性验证就会失败 除了保存重复的文档
  • 如何处理 MongoDB 的断开连接错误

    我在 Node js 进程中看到了这个未捕获的异常 Uncaught exception Error read ETIMEDOUT at TCP onStreamRead internal stream base commons js 16

随机推荐