零基础入门 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);

}
相关推荐
科技小花4 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸4 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain4 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希4 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神4 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员5 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java5 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿5 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴5 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存
YOU OU5 小时前
三大范式和E-R图
数据库