MongoDB创建文档

主键

  • MongoDB的主键和MySQL一样,也是用于保证每一条数据唯一性的
  • 和MySQL不同的是,MongoDB中的主键无需明确指定
  • 每一个文档被添加到集合之后,MongoDB都会自动添加主键
  • MongoDB中文档主键的名称叫做 _id
  • 默认情况下文档主键是一个ObjectId类型的数据
  • ObjectId类型是一个12个字节字符串(5e8c5ae9-c9d35e-759b-d6847d)
    • 4字节是存储这条数据的时间戳
    • 3字节的存储这条数据的那台电脑的标识符
    • 2字节的存储这条数据的MongoDB进程id
    • 3字节是计数器

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

  • 因为MongoDB是支持横向扩展的数据库
  • 横向扩展是指增加数据库服务器的台数
  • 纵向扩展是指增加数据库库服务器的配置
  • 过去一个数据库只能安装在一台电脑上,但是每台电脑的性能是有峰值的
  • 一旦达到峰值就会导致服务器卡顿、宕机、重启等问题
  • 所以过去为了防止如上问题的出现,我们只能不断的纵向扩展
  • 也就是不断的提升服务器的配置,让服务器能处理更多的请求
  • 但是纵向扩展也是有峰值的,一台电脑的配置不可能无限提升
  • 所以为了解决这个问题就有了分布式数据库
  • 分布式数据库是指可以在多台电脑上安装数据库,然后把多台电脑组合成一个完整的数据库,在分布式数据库中,我们可以通过不断同步的方式,让多台电脑都保存相同的内容,当用户请求数据时,我们可以把请求派发给不同的数据库服务器处理,当某一台服务器宕机后,我们还可以继续使用其它服务器处理请求,从而有效的解决了单台电脑性能峰值和单台电脑宕机后服务器不能使用的问题

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

  • 正是因为MongoDB是一个分布式数据库,正是因为分布式数据库可以把请求派发给不同的服务器
  • 所以第一次插入数据时,我们可能派发给了A服务器,插入到了A服务器的数据库中
  • 但是第二次插入数据时,我们又可能派发给了B服务器,插入到了B服务器的数据库中
  • 但是B服务器此时并不知道A服务器当前的主键值是多少,如果通过MySQL中简单的递增来保证数据的唯一性
  • 那么将来在多台服务器同步数据的时候就会出现重复的情况,所以MongoDB的主键并没有使用简单的递增
  • 而是使用了ObjectId类型数据作为主键

🦄是否支持其它类型数据作为主键

  • 在MongoDB中支持除了数组类型以外的其它类型数据类型都可以作为主键
  • 在MongoDB中甚至还支持将一个文档作为另一个文档的主键(复合主键)

连接mongodb

mongo

创建数据库

use User

进入数据库

db

创建集合

db.createcollection('person')

插入数据

db.person.insert({name: 'BNTang',age: 23})
db.person.insert({_id: 1, name: 'JonathanTang', age: 23})

如下这条指令再插入相同类型_id就会报错

db.person.insert({_id: 1, name: 'JonathanTang', age: 23})

可以插入不同类型的_id

db.person.insert({_id: {name: 'BNTang', gender: '男'}, name: 'BNXhh', age: 23})

再次插入就会报错,可以是多条name,gender作为主键,位置要求要不相同就可以

db.person.insert({_id: {name: 'BNTang', gender: '男'}, name: 'BNXhh', age: 23})
db.person.insert({_id: {gender: '男', name: 'BNTang'}, name: 'JonathanLee', age: 23})

MongoDB可视化工具

  • mongodb可视化管理工具,提升在工作当中的开发效率
  • 下载地址:https://www.mongodbmanager.com/
  • 关于安装的话,就和平常安装社交软件一样即可

使用可视化工具连接MongoDB

如上操作完毕之后左侧会出现一个侧边栏,然后可以新建一个命令行界面进行操作即可,用法其实和Navicat差不多,以后文章我都会基于可视化的形式来编写了,不会在命令cmd中编写了

创建数据库

use User

进入数据库

db

创建集合

db.createcollection('person')

插入数据

db.person.insert({name: 'BNTang',age: 23})

写入一个文档

db.<collection>.insertOne(
    <document>,
    {
        writeConcern: <document>
    }
);
  • document:需要写入的文档
  • writeConcern:写入安全级别
db.person.insertOne({name: 'BNTang', age: 23})
db.person.find()

🐤安全级别

  • 用于判断数据是否写入成功
  • 安全级别越高,丢失数据风险越小,但是性能消耗(操作延迟)也就越大
  • 默认情况下MongoDB会开启默认的安全些级别,先不用关心

🦄注意点

  • 在使用 insertOne写入文档时,如果调用insertOne的集合不存在会自动创建
db.student.insertOne({name: 'BNTang', age: 23})
db.student.find()

🐸其它方式

db.<collection>.save(
    <document>,
    {
        writeConcern: <document>
    }
);
db.person.save({name: 'BNTang', age: 23})
db.person.find()

集合不存在会自动创建

db.teacher.save({name: 'JonathanLee', age: 23})
db.teacher.find()

insertOne和save的不同

  • 主键冲突时 insertOne会报错,而save会直接用新值覆盖旧值
db.person.insertOne({_id: 1, name: 'BNTang', age: 23})
db.person.find()
  • insertOne在插入相同的主键会报错
db.person.insertOne({_id: 1, name: 'BNTang', age: 23})
  • save用新数据替换旧数据
db.person.save({_id: 1, name: 'newBNTang', age: 23})
db.person.find()

写入多个文档

db.<collection>.insertMany(
    [<document>, ...],
    {
        writeConcern: <document>,
        ordered: <boolean>
    }
);
  • ordered:是否按顺序写入
    • ordered默认取值是 true,也就是会严格按照顺序写入
    • 如果ordered是 false,则不会按照顺序写入,但写入效率更高(系统会自动优化)
db.person.insertMany(
	[{name: 'BNTang', age: 23}, {name: 'Jonathan', age: 26}, {name: 'zs', age: 18}],
	{}
)
db.person.find()

🐤注意点

  • 如果ordered是true,前面的文档出错,后面的所有文档都不会被写入
  • 如果ordered是false,前面的文档出错,后面的所有符合规范的文档也会被写入
db.person.insertMany(
    [{_id: 1, name: 'BNTang', age: 23}, {_id: 1, name: 'Jonathan', age: 26}, {name: 'zs', age: 18}],
    {ordered: true}
)
db.person.find()

删除集合当中所有文档数据

db.person.remove({})
db.person.insertMany(
    [{_id: 1, name: 'BNTang', age: 23}, {_id: 1, name: 'Jonathan', age: 26}, {name: 'zs', age: 18}],
    {ordered: false}
)
db.person.find()

写入一个或多个文档

db.<collection>.insert(
    <document> or ,[<document>, ...]
    {
        writeConcern: <document>,
        ordered: <boolean>
    }
);
  • insert是insertOne和insertMany结合体

🐤注意点

  • 和insertOne/insertMany一样,集合不存在会自动创建
  • 和insertOne/insertMany一样,主键冲突会报错
  • 和insertMany一样,默认都是按顺序插入,前面的文档出错,后续所有文档不会被插入
db.person.insert(
    [{_id: 1, name: 'BNTang', age: 23}, {_id: 1, name: 'Jonathan', age: 26}, {name: 'zs', age: 18}],
    {ordered: false}
)
db.person.find()
posted @ 2020-08-12 21:33  BNTang  阅读(840)  评论(0编辑  收藏  举报