MongoDB 是一个高性能、开源、面向文档的数据库,设计用于存储大量的数据。它使用类似于 JSON 的 BSON 格式来存储数据,这使得数据结构更加灵活,可以存储复杂的类型,如数组和嵌套文档。
基本概念
- 文档 (Document):MongoDB 的数据结构是基于文档的,一个文档是一个键值对的集合,类似于 JSON 对象。每个文档都有一个唯一的标识符,称为
_id
字段。 - 集合 (Collection):集合是 MongoDB 中存储文档的容器。一个集合可以包含多个文档,这些文档具有相似的结构。
- 数据库 (Database):数据库是 MongoDB 中存储集合的容器。一个数据库可以包含多个集合。
增删改查语句
-
查询 (Query)
- 查询一个集合中的所有文档:
db.collectionName.find()
- 查询满足特定条件的文档:
db.collectionName.find({ field: value })
- 使用查询操作符:
db.collectionName.find({ field: { $operator: value } })
- 查询一个集合中的所有文档:
-
插入 (Insert)
- 插入一个新文档:
db.collectionName.insert({ field1: value1, field2: value2 })
- 插入多个新文档:
db.collectionName.insert([{...}, {...}])
- 插入一个新文档:
-
更新 (Update)
- 更新一个文档:
db.collectionName.update({ _id: ObjectId("...") }, { $set: { field1: value1 } })
- 使用更新操作符:
db.collectionName.update({ _id: ObjectId("...") }, { $operator: value })
- 更新一个文档:
-
删除 (Delete)
- 删除一个文档:
db.collectionName.remove({ _id: ObjectId("...") })
或db.collectionName.deleteOne({ _id: ObjectId("...") })
- 删除多个文档:
db.collectionName.remove({ field: value })
或db.collectionName.deleteMany({ field: value })
- 删除一个文档:
-
聚合 (Aggregation)
- 聚合管道操作符用于处理数据并返回结果。例如,
$group
,$match
,$sort
等。
- 聚合管道操作符用于处理数据并返回结果。例如,
-
索引 (Index)
- 在 MongoDB 中,索引用于提高查询性能。通过创建索引,MongoDB 可以快速定位到特定的数据。常见的索引类型有单字段索引、复合索引等。
-
聚合管道
- MongoDB 的聚合框架允许你执行复杂的分析操作,如分组、过滤、排序和转换数据。
-
地理空间查询
- MongoDB 支持地理空间查询,允许你基于地理位置检索数据。例如,使用
$near
,$within
, 和$geoIntersects
等操作符。
- MongoDB 支持地理空间查询,允许你基于地理位置检索数据。例如,使用
-
文本搜索
- MongoDB 的文本搜索功能允许你在集合中执行全文搜索。你可以使用
$text
操作符来执行文本搜索查询。
- MongoDB 的文本搜索功能允许你在集合中执行全文搜索。你可以使用
-
连接 (Joins)
- MongoDB 支持跨集合的连接操作,允许你结合来自不同集合的数据。这通常通过使用聚合管道来完成。
- 存储过程
- MongoDB 也支持存储过程,允许你编写一段代码并在数据库中保存它,以便以后可以调用它来执行特定的操作。
- 安全性和认证
- MongoDB 支持用户认证和访问控制,确保只有经过授权的用户才能访问数据库中的数据。你可以设置用户角色和权限来控制对数据的访问。
- 复制和分片
- MongoDB 支持复制集和分片,以提供高可用性和可扩展性。复制集允许多个节点保持数据副本,而分片则允许将数据分布到多个节点上以提高性能和容量。
- 监控和日志记录
- MongoDB 提供各种监控工具和日志记录功能,帮助你跟踪数据库的性能和活动,以便及时发现和解决问题。
- 使用 Cursors
- MongoDB 使用游标来遍历查询结果。游标提供了一种迭代遍历查询结果的方法,并允许你执行各种操作,如投影、排序和限制返回的文档数量。
- 更新文档版本
- MongoDB 支持文档版本控制,通过
$set
和$setOnInsert
操作符来更新或插入文档时可以指定版本号。如果版本号不匹配,更新将被拒绝。这有助于实现乐观锁机制。