数组文档查询
$elemMatch:匹配数组中满足条件的元素
// 数据结构
[
{
"_id": 1,
"name": "Alice",
"age": 30,
"friends": [
{ "name": "Bob", "age": 25 },
{ "name": "Charlie", "age": 32 }
]
},
{
"_id": 2,
"name": "David",
"age": 28,
"friends": [
{ "name": "Eve", "age": 22 },
{ "name": "Frank", "age": 29 }
]
}
]
// 查询语句,查找friends中包含年龄大于 30 岁的用户
db.users.find({ "friends": { $elemMatch: { age: { $gt: 30 } } } })
//去重
// 给 age 字段去重
db.users.distinct("age");
// age 大于 25 的用户的去重 name 字段
db.users.distinct("name", { age: { $gt: 25 } });
//查询排序 sort
// 使用关键字sort,按照 age 升序排序
db.users.find().sort({ age: 1 });
// 按照 age 降序排序
db.users.find().sort({ age: -1 });
//分页查询 skip limit
// 使用 limit 关键字,返回前5条数据
db.users.find().limit(5);
// 分页查询,跳过前 5 个文档,并返回接下来的 5 个文档
db.users.find().skip(5).limit(5)
//查询只返回指定列 投影
// 返回 name age,不返回_id, 0表示不返回,1表示返回
db.users.find({}, { name: 1, age: 1, _id: 0 });
//查询不返回指定的列 投影
// 不返回 name, 其他字段都返回,0表示不返回,1表示返回
db.users.find({}, { name: 0 });
//查询统计个数 count
// 查询集合中的所有文档数量
db.users.count();
// 查询年龄大于 30 的文档的个数
db.users.count({ age: { $gt: 10 } });
db.users.find({ age: { $gt: 10 } }).count()
// 这里要使用聚合aggregate,$match的意思和find一样
db.<collection_name>.aggregate([
{ $match: { name: "Tom" } },
{ $count: "total" }
])
聚合查询
符号 | 说明 |
---|---|
$sum | 计算和 |
$avg | 计算平均值 |
$min | 计算最小值 |
$max | 计算最大值 |
$first | 取每组中的第一个文档 |
$last | 取每组中的最后一个文档 |
$push | 将每组中的某个值添加到数组中 |
$addToSet | 将每组中的唯一值添加到数组中(去重) |
$count | 计算文档数量 |
算数操作符
符号 | 说明 |
---|---|
$add | 两个数、日期、时间相加 |
$subtract | 两个数、日期、时间相减 |
$multiply | 两个数相乘 |
$divide | 两个数相除 |
$mod | 两个数取余 |
$abs | 数字的绝对值 |
$ceil | 数字向上取整 |
$floor | 数字向下取整 |
$exp | 返回 e(自然对数的底数)取指定数字次方的值 |
$ln | 数字的自然对数 |
$log | 数字以指定底数为底的对数 |
$log10 | 数字以10为底的对数 |
$pow | 指定数字的指定次方的值 |
$sqrt | 数字的平方根 |
$trunc | 数字截断为整数的值(删除小数部分) |
$match
$match 是 MongoDB 聚合管道中的一个重要阶段,用于筛选文档,仅输出符合指定条件的文档。它的作用类似于 find 操作,但它是聚合管道的一部分,通常用于数据预处理和过滤,以便后续阶段能够处理更少、更相关的数据。
db.<collection_name>.aggregate([
{ $match: { <query> } }
])
// <query>:标准的查询条件,类似于 find 方法中的查询条件。
// 1. 查询用户表中name=tom的文档
db.users.aggregate([
{ $match: { name: "Tom" } }
])
// 2. 查询订单表中 amount大于 300 的订单
db.orders.aggregate([
{ $match: { amount: { $gt: 300 } } }
])
//3. 查询订单中 status = 1 并且 amount 大于 300 的订单
db.orders.aggregate([
{ $match: { $and: [ { status: "A" }, { amount: { $gt: 300 } } ] } }
])
//4. 内嵌查询
db.orders.aggregate([
{ $match: { "address.city": "New York" } }
])
//5. 查找 amount 大于 200 的订单,并按 amount 降序排序
db.orders.aggregate([
{ $match: { amount: { $gt: 200 } } },
{ $sort: { amount: -1 } }
])
第二部分结束
以上来自Juleon博客,转载请注明出处。
热门推荐
JavaScript通过Node.js进行后端开发指南
2025-06-14 08:54docker-compose常用命令,docker资源占用过高处理
2025-04-28 12:26MongoDB数据库该如何备份,又如何去恢复呢?mongodump与mongorestore学习记录拿走!
2025-05-15 10:18Mac重装,前端安装必备软件与工具
2025-05-15 06:15css页面布局技巧之网格布局-display:grid
2025-05-13 03:39debounce(防抖动函数)
2025-04-29 01:24
评论 (1)