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()
分类:
MongoDB4.X+新特性
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具