概述

非关系型数据库,以类 JSON 格式存储数据,是非关系型数据库中与关系型数据库最相似的

CRUD

1. Create(插入文档)

向集合中插入新文档。

插入单个文档

db.collection.insertOne({
  name: "Alice",
  age: 25,
  job: "Engineer"
});

插入多个文档

db.collection.insertMany([
  { name: "Bob", age: 30, job: "Designer" },
  { name: "Charlie", age: 35, job: "Manager" }
]);

2. Read(查询文档)

从集合中查询文档。

查询所有文档

db.collection.find();

查询特定条件的文档

db.collection.find({ age: { $gt: 25 } }); // 查询 age 大于 25 的文档

查询并返回特定字段

db.collection.find({}, { name: 1, job: 1 }); // 只返回 name 和 job 字段

查询单个文档

db.collection.findOne({ name: "Alice" });

使用比较运算符

db.collection.find({ age: { $gte: 25, $lte: 35 } }); // 查询 age 在 25 到 35 之间的文档

使用逻辑运算符

db.collection.find({ $or: [{ age: 25 }, { job: "Engineer" }] }); // 查询 age 为 25 或 job 为 Engineer 的文档

排序和分页

db.collection.find().sort({ age: 1 }).limit(10); // 按 age 升序排序,返回前 10 条

3. Update(更新文档)

更新集合中的文档。

更新单个文档

db.collection.updateOne(
  { name: "Alice" }, // 查询条件
  { $set: { age: 26 } } // 更新操作
);

更新多个文档

db.collection.updateMany(
  { job: "Engineer" }, // 查询条件
  { $set: { salary: 80000 } } // 更新操作
);

使用更新运算符

  • $set​:设置字段值。存在字段则覆盖原有值,不存在则新建字段
  • $unset​:删除字段。
  • %rename​:重命名字段。
  • $inc​:增加字段值。
  • $push​:向数组字段添加元素。
  • $pull​:从数组字段删除元素。
    示例:
db.collection.updateOne(
  { name: "Alice" },
  {
	$inc: { age: 1 },		// 将 age 增加 1
	$rename: { oldName: "newName" },	// 改名,前者可加引号,后者必须加引号
	$unset: { name: "" }	// 删除name字段
  }
);

4. Delete(删除文档)

从集合中删除文档。

删除单个文档

db.collection.deleteOne({ name: "Alice" });

删除多个文档

db.collection.deleteMany({ age: { $lt: 30 } }); // 删除 age 小于 30 的所有文档

5. 批量操作

MongoDB 支持批量写入操作,可以一次性执行多个插入、更新或删除操作。

批量写入

db.collection.bulkWrite([
  { insertOne: { document: { name: "David", age: 28 } } },
  { updateOne: { filter: { name: "Alice" }, update: { $set: { age: 27 } } } },
  { deleteOne: { filter: { name: "Bob" } } }
]);

6. 索引操作

为了提高查询性能,可以为集合创建索引。

创建索引

db.collection.createIndex({ name: 1 }); // 在 name 字段上创建升序索引

查看索引

db.collection.getIndexes();

删除索引

db.collection.dropIndex("name_1"); // 删除 name 字段上的索引

7. 聚合操作

MongoDB 的聚合框架(Aggregation Pipeline)用于处理复杂的数据操作。

示例:按 job 分组并计算平均年龄

db.collection.aggregate([
  { $group: { _id: "$job", avgAge: { $avg: "$age" } } }
]);

8. 事务操作(适用于多文档操作)

MongoDB 支持事务,确保多个操作的原子性。

示例:使用事务

const session = db.getMongo().startSession();
session.startTransaction();
try {
  const collection = session.getDatabase("test").collection("collectionName");
  collection.insertOne({ name: "Eve", age: 22 });
  collection.updateOne({ name: "Alice" }, { $set: { age: 26 } });
  session.commitTransaction();
} catch (error) {
  session.abortTransaction();
} finally {
  session.endSession();
}