美文网首页
02-MongoDB-创建文档和删除文档

02-MongoDB-创建文档和删除文档

作者: 低头看云 | 来源:发表于2020-10-10 10:07 被阅读0次

创建文档

1.主键

MongoDB的主键和MySQL一样, 也是用于保证每一条数据唯一性的

和MySQL不同的是, MongoDB中的主键无需明确指定

  • 每一个文档被添加到集合之后, MongoDB都会自动添加主键

  • MongoDB中文档主键的名称叫做 _id

默认情况下文档主键是一个ObjectId类型的数据

  • ObjectId类型是一个12个字节字符串(5e8c5ae9-c9d35e-759b-d6847d)

  • 4字节是存储这条数据的时间戳

  • 3字节的存储这条数据的那台电脑的标识符

  • 2字节的存储这条数据的MongoDB进程id

  • 3字节是计数器

2.1为什么要使用ObjectId类型数据作为主键?

因为MongoDB是支持'横向扩展'的数据库

  • 横向扩展是指'增加数据库服务器的台数

  • 纵向扩展是指'增加数据库库服务器的配置'

过去一个数据库只能安装在一台电脑上, 但是每台电脑的性能是有峰值的一旦达到峰值就会导致服务器卡顿、宕机、重启等问题.

所以过去为了防止如上问题的出现,我们只能不断的'纵向扩展'

也就是不断的提升服务器的配置, 让服务器能处理更多的请求

但是纵向扩展也是有峰值的, 一台电脑的配置不可能无限提升

所以为了解决这个问题就有了分布式数据库

分布式数据库是指可以在多台电脑上安装数据库, 然后把多台电脑组合成一个完整的数据库,

在分布式数据库中,我们可以通过不断同步的方式, 让多台电脑都保存相同的内容

当用户请求数据时, 我们可以把请求派发给不同的数据库服务器处理

当某一台服务器宕机后, 我们还可以继续使用其它服务器处理请求

从而有效的解决了单台电脑性能峰值和单台电脑宕机后服务器不能使用的问题

2.2为什么要使用ObjectId类型数据作为主键?

正是因为MongoDB是一个分布式数据库, 正是因为分布式数据库可以把请求派发给不同的服务器

所以第一次插入数据时, 我们可能派发给了A服务器, 插入到了A服务器的数据库中

但是第二次插入数据时, 我们又可能派发给了B服务器, 插入到了B服务器的数据库中

但是B服务器此时并不知道A服务器当前的主键值是多少, 如果通过MySQL中简单的递增来保证数据的唯一性

那么将来在多台服务器同步数据的时候就会出现重复的情况, 所以MongoDB的主键并没有使用简单的递增

而是使用了ObjectId类型数据作为主键

3.是否支持其它类型数据作为主键?

3.1在MongoDB中支持除了'数组类型'以外的其它类型数据作为主键

3.2在MongoDB中甚至还支持将一个文档作为另一个文档的主键(复合主键)

db.person.insert({name: 'css', age: 33});
db.person.insert({_id: 1, name: 'css', age: 33});
#db.person.insert({_id: 1, name: 'csss', age: 33}); #报错
db.person.insert({_id: '1', name: 'css', age: 33});
db.person.insert({_id: {name:'js', gender: '男'}, name: 'css', age: 33});
#db.person.insert({_id: {name:'js', gender: '男'}, name: 'css', age: 33}); #报错
db.person.insert({_id: {gender: '男', name:'js'}, name: 'css', age: 33});

写入文档

1.写入一个文档

db.<collection>.insertOne(

    <document>,
    {
        writeConcern: <document>
    }

);

document: 需要写入的文档

writeConcern: 写入安全级别

2.安全级别

用于判断数据是否写入成功,

安全级别越高, 丢失数据风险越小, 但是性能消耗(操作延迟)也就越大

默认情况下MongoDB会开启默认的安全些级别,先不用关心

3.注意点

在使用insertXXX写入文档时, 如果调用insertOne的集合不存在会自动创建

db.person.insertOne({name:'zs', age:18}) 
db.person.find() 
db.student.insertOne({name:'zs', age:18}) #集合不存在会自动创建 db.student.find()

4.其它方式

db.<collection>.save(

​ <document>,

​ {

​ writeConcern: <document>

​ }

);

db.person.save({name:'ls', age:19})
db.person.find()
db.teacher.save({name:'ls', age:19}) #集合不存在会自动创建
db.teacher.find()

5.insertOne和save不同

主键冲突时insertOne会报错,而save会直接用新值覆盖久值

db.person.insertOne({_id:1, name:'ww', age:22})
db.person.find()
db.person.insertOne({_id:1, name:'ww', age:22}) #报错
db.person.save({_id:1, name:'zs', age:66}) #用新数据替换久数据
db.person.find()

6.写入多个文档

db.<collection>.insertMany(

​ [<document>, ...],

​ {

​ writeConcern: <document>,

​ ordered: <boolean>

​ }

);

ordered: 是否按顺序写入

ordered默认取值是true, 也就是会严格按照顺序写入

如果ordered是false, 则不会按照顺序写入, 但写入效率更高(系统会自动优化)

db.person.insertMany(
[{name:'zs', age:18},{name:'ls', age:19},{name:'ww', age:20}],
{}
)
db.person.find()

注意点:

如果ordered是true, 前面的文档出错, 后面的所有文档都不会被写入

如果ordered是false, 前面的文档出错, 后面的所有文档也会被写入


db.person.insertMany(
[{_id:1, name:'zs', age:18},{_id:1, name:'ls', age:19},{_id:2, name:'ww', age:20}],
{ ordered: true }
)
// 如果ordered:true, _id相同,那么后面数据不会插入
db.person.find()

db.person.remove({})

db.person.insertMany(
[{_id:1, name:'zs', age:18},{_id:1, name:'ls', age:19},{_id:2, name:'ww', age:20}],
{ ordered: false }
)
// 如果 order:false, _id相同, 后面的数据也会被插入
db.person.find()

7.Insert写入一个或多个文档

db.<collection>.insert(

​ <document> or ,[<document>, ...]

​ {

​ writeConcern: <document>,

​ ordered: <boolean>

​ }

);

insertOne和insertMany结合体

2.注意点:

和insertOne/insertMany一样, 集合不存在会自动创建

和insertOne/insertMany一样, 主键冲突会报错

和insertMany一样, 默认都是按顺序插入, 前面的文档出错, 后续所有文档不会被插入

删除文档

1.删除文档

db.<collection>.remove(<query>, <options>)

<query>: 删除筛选条件

<options>: 删除额外配置

2.示例

db.person.insert([
{name:'zs', age:18},
{name:'zs', age:19},
{name:'ls', age:20},
{name:'ls', age:21},
{name:'ww', age:22},
{name:'zl', age:23},
])


//2.1删除所有满足条件
// 注意点: 和update方法不同, remove方法默认就会删除所有满足条件的数据
db.person.remove({name:'zs'})
//2.2删除第一个满足条件
db.person.remove({name:'ls'},{justOne:true})
//2.3删除所有文档
db.person.remove({})

相关文章

  • 02-MongoDB-创建文档和删除文档

    创建文档 1.主键 MongoDB的主键和MySQL一样, 也是用于保证每一条数据唯一性的 和MySQL不同的是,...

  • Elasticsearch 7.x 入门之restful请求(2

    使用restful操作 创建文档新建文档.png 查看文档文档信息.png 删除文档文档删除.png 新建文档自动...

  • mongodb常用命令

    一、数据库 创建数据库 删除数据库 二、集合 创建集合 删除集合 三、文档 插入文档 删除文档 更新文档 四、查询...

  • MongoDB基本操作

    创建数据库 删除数据库 插入文档 删除文档 参数说明: query:可选,删除的文档的条件 justOne:可选,...

  • Elasticsearch 增删改查

    1、索引的创建和查询 2、索引的mapping导入和查询 3、索引的删除 4、文档的插入 5、文档的查询 6、文档的删除

  • ElasticSearch-文档-基本增删改查

    Maven项目的pom.xml 创建文档 1.新建一个类用于封装数据 2.创建 批量创建文档 修改文档 删除文档 ...

  • ES相关笔记

    常用操作 创建文档 检索文档 更多参考ES权威指南更多查询示例 删除文档 更新文档 更多脚本更新操作 并发更新控制...

  • nodejs--day5笔记

    数据库 1. 创建集合 2. 创建文档 create方法 3.导入数据 4.查询数据 5.删除文档 6. 更新文档

  • Java MongoDB 基本操作

    本文介绍如何使用Java操作MongoDB,如创建连接数据库、集合和文档,保存、更新、删除和查询文档。 1. 引入...

  • JQuery-DOM操作

    转载请注明出处DOM操作:即文档对象模型操作。html是一个文档。 创建、删除、复制、插入、替换、包裹节点。 创建...

网友评论

      本文标题:02-MongoDB-创建文档和删除文档

      本文链接:https://www.haomeiwen.com/subject/opelpktx.html