MongoDB 全语法大全
数据库操作
复制代码
show dbs // 查看所有数据库
use test // 切换(或创建)数据库
db // 查看当前数据库
db.dropDatabase() // 删除当前数据库
集合(Collection)操作
复制代码
show collections // 查看所有集合
db.createCollection("user") // 创建集合
db.user.drop() // 删除集合
插入文档(Create)
复制代码
// 插入一条
db.user.insertOne({ name: "刘备", age: 24 })
// 插入多条
db.user.insertMany([
{ name: "关羽", age: 28 },
{ name: "张飞", age: 27 }
])
// 旧写法(仍支持)
db.user.insert({ name: "赵云", age: 26 })
查询文档(Read)
基本查询
复制代码
db.user.find() // 查询所有文档
db.user.findOne() // 查询第一条
db.user.find({ name: "刘备",age :"24"}) // 条件查询 // 条件查询
db.user.find().pretty() // 美化输出
比较查询运算符
| 运算符 |
说明 |
示例 |
$eq |
等于 |
db.user.find({ name: "刘备",age :{ $eq: "24"}}) |
$ne |
不等于 |
{ age: { $ne: 24 } } |
$gt |
大于 |
{ age: { $gt: 24 } } |
$lt |
小于 |
{ age: { $lt: 24 } } |
$gte |
大于等于 |
{ age: { $gte: 24 } } |
$lte |
小于等于 |
{ age: { $lte: 24 } } |
$in |
在数组中 |
{ age: { $in: [24, 25, 26] } } |
$nin |
不在数组中 |
{ age: { $nin: [24, 25] } } |
逻辑查询运算符
| 运算符 |
说明 |
示例 |
$and |
与 |
db.user.find({ $and: [ { age: { $gt: 25 } }, { name: "刘备" } ] }) |
$or |
或 |
{ $or: [ { age: 24 }, { name: "张飞" } ] } |
$not |
非 |
{ age: { $not: { $gt: 30 } } } |
$nor |
都不满足 |
{ $nor: [ { age: 24 }, { name: "刘备" } ] } |
模糊查询(正则表达式)
复制代码
db.user.find({ name: /刘/ }) // 模糊匹配包含"刘"
db.user.find({ name: /^刘/ }) // 以"刘"开头
db.user.find({ name: /飞$/ }) // 以"飞"结尾
db.user.find({ name: /liu/i }) // 不区分大小写
投影(指定显示字段)
| 规则 |
说明 |
全用 1 |
明确指定要返回的字段(其他字段不返回) |
全用 0 |
明确指定不要返回的字段(其他字段都返回) |
_id 是例外 |
可以在两种模式下单独设置 _id: 0 来隐藏它 |
不能混用 1 和 0 |
除非只对 _id 使用 0 |
复制代码
db.user.find({}, { name: 1, age: 1, _id: 0 })
排序、分页
复制代码
db.user.find().sort({ age: 1 }) // 升序
db.user.find().sort({ age: -1 }) // 降序
db.user.find().skip(5).limit(10) // 分页(跳过5条,取10条)
统计数量
复制代码
db.user.countDocuments({ age: { $gte: 25 } })
更新文档(Update)
修改一条
复制代码
db.user.updateOne(
{ name: "刘备" },
{ $set: { age: 30 } }
)
修改多条
复制代码
db.user.updateMany(
{ age: { $lt: 25 } },
{ $set: { status: "未成年" } }
)
替换整个文档
复制代码
db.user.replaceOne(
{ name: "张飞" },
{ name: "张翼德", age: 29, weapon: "丈八蛇矛" }
)
常用更新操作符
| 操作符 |
功能 |
示例 |
$set |
设置字段 |
{ $set: { age: 30 } } |
$unset |
删除字段 |
{ $unset: { weapon: "" } } |
$inc |
数值自增/自减 |
{ $inc: { age: 1 } } |
$rename |
重命名字段 |
{ $rename: { name: "username" } } |
$push |
数组追加元素 |
{ $push: { skills: "骑马" } } |
$addToSet |
数组追加(去重) |
{ $addToSet: { skills: "骑马" } } |
$pull |
数组移除元素 |
{ $pull: { skills: "骑马" } } |
$pop |
移除首或尾元素 |
{ $pop: { skills: 1 } } // 移除最后一个 |
删除文档(Delete)
复制代码
db.user.deleteOne({ name: "刘备" }) // 删除一条
db.user.deleteMany({ age: 24 }) // 删除多条
db.user.deleteMany({}) // 清空集合
db.user.drop() // 删除集合
聚合查询(Aggregate)
类似 SQL 的 GROUP BY、HAVING、ORDER BY。
复制代码
db.user.aggregate([
{ $match: { age: { $gte: 20 } } }, // 筛选条件
{ $group: { _id: "$name", total: { $sum: 1 } } }, // 分组统计
{ $sort: { total: -1 } } // 排序
])
常用聚合操作符
| 操作符 |
说明 |
$sum |
求和 |
$avg |
平均值 |
$max |
最大值 |
$min |
最小值 |
$count |
计数 |
$push |
收集数组 |
$project |
投影(控制输出字段) |
索引(Index)
复制代码
db.user.createIndex({ name: 1 }) // 创建升序索引
db.user.createIndex({ name: 1, age: -1 }) // 复合索引
db.user.getIndexes() // 查看索引
db.user.dropIndex({ name: 1 }) // 删除索引
去重与统计
复制代码
db.user.distinct("name") // 返回 name 的去重值
db.user.countDocuments({ age: 30 }) // 统计数量
管理命令(Admin)
复制代码
db.stats() // 查看当前数据库统计信息
db.serverStatus() // 查看服务器状态
db.currentOp() // 查看当前操作
db.killOp(opid) // 杀死某个操作
MongoDB 与 Spring Boot 整合
一、在MongoDB中导入测试数据
复制代码
db.user.insertMany([
{
name: "刘备",
age: 35,
gender: "男",
email: "liubei@example.com",
city: "蜀国",
hobbies: ["骑马", "战略", "结义"],
createTime: new Date()
},
{
name: "关羽",
age: 32,
gender: "男",
email: "guanyu@example.com",
city: "蜀国",
hobbies: ["刀法", "忠义"],
createTime: new Date()
},
{
name: "张飞",
age: 30,
gender: "男",
email: "zhangfei@example.com",
city: "蜀国",
hobbies: ["喝酒", "打架"],
createTime: new Date()
},
{
name: "赵云",
age: 28,
gender: "男",
email: "zhaoyun@example.com",
city: "常山",
hobbies: ["枪法", "守护"],
createTime: new Date()
},
{
name: "诸葛亮",
age: 29,
gender: "男",
email: "zhugeliang@example.com",
city: "卧龙岗",
hobbies: ["发明", "智谋"],
createTime: new Date()
}
])
二、引入依赖
复制代码
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
三、配置 MongoDB 连接
复制代码
spring:
data:
mongodb:
host: localhost
port: 27017
database: springdb
# 如果你有设置用户名密码,可以加上:
# username: root
# password: 123456
四、实体类设计
java
复制代码
package com.test.mongodbdemo.pojo;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.Date;
import java.util.List;
@Data
@Document(collection = "user")
public class User {
@Id
private String id;
private String name;
private Integer age;
private String gender;
private String email;
private String city;
private List<String> hobbies;
private Date createTime;
}
五、接口设计
java
复制代码
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
// 查询所有用户
@GetMapping("/all")
public List<User> getAll() {
return userService.findAll();
}
// 新增用户
@PostMapping("/add")
public User addUser(@RequestBody User user) {
return userService.saveUser(user);
}
// 模糊 + 年龄范围查询
@GetMapping("/search")
public List<User> searchByNameAndAge(
@RequestParam String keyword,
@RequestParam int minAge,
@RequestParam int maxAge) {
return userService.findByNameAndAgeRange(keyword, minAge, maxAge);
}
// 按兴趣匹配
@GetMapping("/hobbies")
public List<User> findByHobbies(@RequestParam List<String> hobbies) {
return userService.findByHobbies(hobbies);
}
//复合查询(城市 + 年龄 + 时间范围 + 分页)
@GetMapping("/complex")
public List<User> findByComplex(
@RequestParam String city,
@RequestParam int minAge,
@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date start,
@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date end,
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "5") int size) {
return userService.findUsersByConditions(city, minAge, start, end, page, size);
}
}
public interface UserService {
List<User> findAll();
List<User> findByNameAndAgeRange(String keyword, int minAge, int maxAge);
List<User> findByHobbies(List<String> hobbies);
List<User> findUsersByConditions(String city, int minAge, Date start, Date end, int page, int size);
User saveUser(User user);
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
public List<User> findAll() {
return userRepository.findAll();
}
@Override
public List<User> findByNameAndAgeRange(String keyword, int minAge, int maxAge) {
return userRepository.findByNameLikeAndAgeBetween(keyword, minAge, maxAge);
}
@Override
public List<User> findByHobbies(List<String> hobbies) {
return userRepository.findByHobbiesIn(hobbies);
}
@Override
public List<User> findUsersByConditions(String city, int minAge, Date start, Date end, int page, int size) {
return userRepository.findUsersByCityAndAgeAfterAndTimeRange(city, minAge, start, end, (Pageable) PageRequest.of(page, size));
}
@Override
public User saveUser(User user) {
user.setCreateTime(new Date());
return userRepository.save(user);
}
}
@org.springframework.stereotype.Repository
public interface UserRepository extends MongoRepository<User, String> {
// ① 按姓名模糊 + 年龄范围查询
@Query("{ 'name': { $regex: ?0, $options: 'i' }, 'age': { $gte: ?1, $lte: ?2 } }")
List<User> findByNameLikeAndAgeBetween(String keyword, int minAge, int maxAge);
// ② 兴趣匹配(数组包含任意一个)
@Query("{ 'hobbies': { $in: ?0 } }")
List<User> findByHobbiesIn(List<String> hobbies);
// ③ 多条件组合 + 时间范围 + 排序(分页)
@Query("{ 'city': ?0, 'age': { $gte: ?1 }, 'createTime': { $gte: ?2, $lte: ?3 } }")
List<User> findUsersByCityAndAgeAfterAndTimeRange(String city, int minAge, Date start, Date end, Pageable pageable);
}