零基础入门 MongoDB:文档型数据库的魅力与应用

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 来隐藏它
不能混用 10 除非只对 _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 BYHAVINGORDER 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);

}
相关推荐
o***74171 小时前
一条sql 在MySQL中是如何执行的
数据库·sql·mysql
科技块儿1 小时前
常见IP归属地数据库对比
网络·数据库·tcp/ip
足球中国1 小时前
SQL Server 索引维护完整指南
数据库
m***92381 小时前
【MySQL】C# 连接MySQL
数据库·mysql·c#
u***28471 小时前
SpringBoot集成Flink-CDC,实现对数据库数据的监听
数据库·spring boot·flink
m***11901 小时前
Ubuntu 系统下安装 Nginx
数据库·nginx·ubuntu
e***98571 小时前
Window下Redis的安装和部署详细图文教程(Redis的安装和可视化工具的使用)
数据库·redis·缓存
xingyue_S1 小时前
MySQL 数据库(一) -- 初体验
数据库·mysql·oracle
X***C8621 小时前
【Oracle11g SQL详解】UPDATE 和 DELETE 操作的正确使用
数据库·sql