数组文档查询

$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博客,转载请注明出处。