<返回目录     Powered by claud/xia兄

第4课: 查询基础

find() - 查询所有文档

// 查询集合中的所有文档
db.users.find()

// 格式化输出
db.users.find().pretty()

// 查询结果是游标(cursor),可以迭代

findOne() - 查询单个文档

// 返回第一个匹配的文档
db.users.findOne()

// 查询特定条件的第一个文档
db.users.findOne({ name: "张三" })

条件查询

// 精确匹配
db.users.find({ age: 25 })

// 多个条件(AND关系)
db.users.find({
    age: 25,
    city: "北京"
})

// 查询嵌套字段
db.users.find({
    "address.city": "北京"
})

投影(Projection)

指定返回哪些字段:

// 只返回name和age字段(_id默认返回)
db.users.find({}, { name: 1, age: 1 })

// 排除_id字段
db.users.find({}, { name: 1, age: 1, _id: 0 })

// 排除某些字段
db.users.find({}, { password: 0, email: 0 })
注意:

不能同时使用包含和排除(_id除外),要么指定包含的字段,要么指定排除的字段。

限制返回数量

// 限制返回5条记录
db.users.find().limit(5)

// 跳过前10条,返回接下来的5条
db.users.find().skip(10).limit(5)

// 分页查询示例(第3页,每页10条)
const page = 3;
const pageSize = 10;
db.users.find()
    .skip((page - 1) * pageSize)
    .limit(pageSize)

排序

// 按age升序排序
db.users.find().sort({ age: 1 })

// 按age降序排序
db.users.find().sort({ age: -1 })

// 多字段排序(先按age降序,再按name升序)
db.users.find().sort({ age: -1, name: 1 })

计数

// 统计文档数量
db.users.countDocuments()

// 统计符合条件的文档数量
db.users.countDocuments({ age: { $gte: 18 } })

// 估算文档数量(更快但不精确)
db.users.estimatedDocumentCount()

去重

// 获取age字段的所有不同值
db.users.distinct("age")

// 获取符合条件的不同值
db.users.distinct("city", { age: { $gte: 18 } })

链式调用

// 组合多个查询方法
db.users.find({ age: { $gte: 18 } })
    .sort({ age: -1 })
    .skip(10)
    .limit(5)
    .projection({ name: 1, age: 1 })

// 执行顺序:sort -> skip -> limit(与书写顺序无关)

查询数组字段

// 查询数组包含特定值
db.users.find({ hobbies: "读书" })

// 查询数组包含多个值(任意一个匹配)
db.users.find({ hobbies: { $in: ["读书", "旅游"] } })

// 查询数组完全匹配
db.users.find({ hobbies: ["读书", "旅游"] })  // 顺序和数量必须完全一致

实战示例

// 电商系统商品查询
use ecommerce

// 查询价格在100-500之间的商品,按价格升序
db.products.find({
    price: { $gte: 100, $lte: 500 },
    stock: { $gt: 0 }
})
.sort({ price: 1 })
.limit(20)

// 查询特定分类的商品名称和价格
db.products.find(
    { category: "电子产品" },
    { name: 1, price: 1, _id: 0 }
)

// 分页查询用户订单
db.orders.find({ userId: "user123" })
    .sort({ createdAt: -1 })
    .skip(0)
    .limit(10)
练习题:
  1. 查询年龄大于等于18岁的所有用户
  2. 查询北京市的用户,只返回姓名和邮箱
  3. 查询前10个用户,按注册时间降序排列
  4. 统计年龄在20-30岁之间的用户数量
  5. 获取所有不同的城市列表
  6. 实现分页查询:第2页,每页显示15条记录