Mongodb 常用命令总结

2024-10-24 18:13:27

01 嵌套文档数组中每一项添加字段

mongodb 里文档格式如下:

{ 
  id: '', 
  activities: [ 
    {id: '' }, 
  ], 
}

想要给 activities 数组中每一项都加一个字段 sort 字段,值都是 1,怎么实现?

db.collection.updateMany(
  {},  // 空查询条件表示更新所有文档
  { 
    $set: { 
      "activities.$[].sort": 1  // $[] 表示匹配数组中的所有元素
    }
  }
)

其中:$[] 是 全选操作符,会选中 activities 数组中的每一项,无需指定具体索引或条件

02 嵌套文档数组根据sort字段排序后返回

mongodb 里文档格式如下:

{ 
  id: '', 
  activities: [ 
    { id: '', sort: 1 }, 
  ], 
} 

查询数据时想要 activities 数组根据 sort 字段升序排序返回结果,怎么操作?

db.collection.aggregate([
  { $unwind: "$activities" },          // 展开 activities 数组
  { $sort: { "activities.sort": 1 } }, // 按 sort 字段升序排序
  {
    $group: {
      _id: "$_id",                     // 按原文档 _id 分组
      user_id: { $first: "$user_id" },           // 保留原字段
      activities: { $push: "$activities" } // 将排序后的子文档重新组合成数组
    }
  }
])

03 $toDate 将日期字符串转换为日期类型

db.collection.aggregate([
  {
    "$project": {
        "date": { "$toDate": "$date" },
    }
  },
])

04 指定时间区间内按周分组后价格字段求和

文档格式如下:

{
  date: '2024-04-01',
  amt: 12,
}

$isoWeek 的一周是周一到周日

$week 的一周是周日到周六

db.collection.aggregate([
  {
    "$match": {
        // 根据具体需求设置筛选条件
        "date": {
            "$gte": new Date("2024-04-01"), 
            "$lte": new Date("2024-04-30") 
        },
    }
  },
  {
    "$group": {   // 按照周进行分组
        "_id": { "$isoWeek": "$date" }, // 使用 $isoWeek 操作符按照周分组
        "sum": { "$sum": "$amt" } // 对指定字段进行求和
    }
  }
])

05 新增 week 字段:日期字符串转换为第几周

db.getCollection('details').aggregate([
  {
        "$project": {
            date: 1,
            week: { $isoWeek: { "$toDate": "$date" } },
        }
  },
])

返回首页

本文总阅读量  次
皖ICP备17026209号-3
总访问量: 
总访客量: