MongoDb简介

MongoDb入门

MongoDB 不是关系数据库,而是面向文档(document-oriented)的数据库。

MongoDB 的设计采用了横向扩展。面向文档的数据模型使跨多台服务器拆分数据更加容易。MongoDB 会自动平衡跨集群的数据和负载,自动重新分配文档,并将读写操作路由到正确的机器上

img

文档

文档是 MongoDB 的核心概念:它是一组有序键值的集合。文档的表示形式因编程语言而异,但大多数语言具有自然匹配的数据结构,比如映射、哈希表或字典。

{"greeting" : "Hello, world!"}

文档中的值不仅仅是“二进制大对象”,它们可以是几种不同的数据类型之一

文档中的键是字符串类型,会区分类型和大小写,文档不能包含重复的键

集合

集合就是一组文档。如果将文档比作关系数据库中的行,那么一个集合就相当于一张表。

动态模式

集合具有动态模式的特性。这意味着一个集合中的文档可以具有任意数量的不同“形状”

例如,以下两个文档可以存储在同一个集合中:
{"greeting" : "Hello, world!", "views": 3}
{"signoff": "Good night, and good luck"}

命名

集合由其名称进行标识。集合名称可以是任意 UTF-8 字符串,但有以下限制。

  • 集合名称不能是空字符串("")。
  • 集合名称不能含有 \0(空字符),因为这个字符用于表示一个集合名称的结束。
  • 集合名称不能以 system. 开头

子集合

使用 . 字符分隔不同命名空间的子集合是一种组织集合的惯例

例如,有一个具有博客功能的应用程序,可能包含名为 blog.posts 和名为 blog.authors 的集合。

数据库

MongoDB 使用集合对文档进行分组,使用数据库对集合进行分组

插入文档

insertMany

如果要向一个集合中插入多个文档,那么可以使用 insertMany。

在当前版本中,MongoDB 能够接受的最大消息长度是 48MB,因此在单次批量插入中能够插入的文档是有限制的。如果尝试插入超过 48MB 的数据,则多数驱动程序会将这个批量插入请求拆分为多个 48MB 的批量插入请求。详情请查看所使用驱动程序的相关文档。

在使用 insertMany 执行批量插入时,如果中途某个文档发生了某种类型的错误,那么接下来会发生什么取决于所选择的是有序操作还是无序操作。可以指定一个选项文档作为insertMany 的第二个参数。将选项文档中的 "ordered" 键指定为 true,可以确保文档按提供的顺序插入。指定为 false 则允许 MongoDB 重新排列插入的顺序以提高性能。如果未特别指定,则默认为有序插入。对于有序插入,插入顺序由传递给 insertMany 的数组进行定义。如果一个文档产生了插入错误,则数组中在此之后的文档均不会被插入集合中。对于无序插入,MongoDB 将尝试插入所有文档,而不管某些插入是否产生了错误。

插入校验

MongoDB 会对要插入的数据进行最基本的检查:检查文档的基本结构,如果不存在 "_id"字段,则自动添加一个。其中一项最基本的结构检查就是文档大小:所有文档都必须小于16MB。这是一个人为设定的限制(将来可能会提高),主要是为了防止不良的模式设计并确保性能上的一致。要查看 doc 文档的二进制 JSON(BSON)大小(以字节为单位),可以在 shell 中执行 Object.bsonsize(doc)。

删除文档

CRUD API 为此提供了 deleteOne 和 deleteMany 两种方法。这两种方法都将筛选文档(filter document)作为第一个参数。

更新文档

将文档存入数据库中之后,可以使用以下几种更新方法之一对其进行更改:updateOne、updateMany 和 replaceOne。updateOne 和 updateMany 都将筛选文档作为第一个参数,将变更文档作为第二个参数,后者对要进行的更改进行描述。replaceOne 同样将筛选文档作为第一个参数,但第二个参数是一个用来替换所匹配的筛选文档的新文档。

更新文档是原子操作:如果两个更新同时发生,那么首先到达服务器的更新会先被执行,然后再执行下一个更新。因此,相互冲突的更新可以安全地迅速接连完成,而不会破坏任何文档:最后一次更新将“成功”。如果不想使用默认行为,则可以考虑使用文档版本控制模式

文档替换

replaceOne 会用新文档完全替换匹配的文档。这对于进行大规模模式迁移的场景非常有用。

使用更新运算符

通常文档只会有一部分需要更新。可以使用原子的更新运算符(update operator)更新文档中的特定字段。更新运算符是特殊的键,可用于指定复杂的更新操作,比如更改、添加或删除键,甚至可以操作数组和内嵌文档。

upsert

upsert 是一种特殊类型的更新。如果找不到与筛选条件相匹配的文档,则会以这个条件和更新文档为基础来创建一个新文档;如果找到了匹配的文档,则进行正常的更新。upsert用起来非常方便,有了它便不再需要“预置”集合:通常可以使用同一套代码创建和更新文档。

更新多个文档

到目前为止,本章都是使用 updateOne 来描述更新操作。updateOne 只会更新找到的与筛选条件匹配的第一个文档。如果匹配的文档有多个,它们将不会被更新。要修改与筛选器匹配的所有文档,请使用 updateMany。updateMany 遵循与 updateOne 同样的语义并接受相同的参数。关键的区别在于可能会被更改的文档数量。

posted @   每天提醒自己要学习  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示