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

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

一、简介

本篇记录备份的是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() 毕竟它既可以创建单个文档,也可以添加多个文档,当然具体还是根据自己的习惯与喜好进行选择~

猜你喜欢

转载自blog.csdn.net/zy21131437/article/details/128057245
今日推荐