首页技术栈归档照片墙音乐日记随想收藏夹友链留言关于

MongoDB其他操作

写作时间:2026-07-08

MongoDB其他操作

MongoDB $type 操作符

描述

在本章节中,我们将继续讨论MongoDB中条件操作符 $type。

$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。

MongoDB 中可以使用的类型如下表所示:

类型 数字 备注
Double 1
String 2
Object 3
Array 4
Binary data 5
Undefined 6 已废弃。
Object id 7
Boolean 8
Date 9
Null 10
Regular Expression 11
JavaScript 13
Symbol 14
JavaScript (with scope) 15
32-bit integer 16
Timestamp 17
64-bit integer 18
Min key 255 Query with -1.
Max key 127

实例

//查询age为数字的
db.student.find({age : {$type : 'number'}})
//查询名字为是字符串的
db.student.find({"names" : {$type : 'string'}})

MongoDB 基本聚合

MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。

有点类似 SQL 语句中的 count(*)。

aggregate() 方法

MongoDB中聚合的方法使用aggregate()。

语法

aggregate() 方法的基本语法格式如下所示:

>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
表达式 描述 实例
$sum 计算总和。 db.mycol.aggregate([{group : {_id : "by_user", num_tutorial : {sum:"sum : "sum:"likes"}}}])
$avg 计算平均值 db.mycol.aggregate([{group : {_id : "by_user", num_tutorial : {avg:"avg : "avg:"likes"}}}])
$min 获取集合中所有文档对应值得最小值。 db.mycol.aggregate([{group : {_id : "by_user", num_tutorial : {min:"min : "min:"likes"}}}])
$max 获取集合中所有文档对应值得最大值。 db.mycol.aggregate([{group : {_id : "by_user", num_tutorial : {max:"max : "max:"likes"}}}])
$push 将值加入一个数组中,不会判断是否有重复的值。 db.mycol.aggregate([{group : {_id : "by_user", url : {push:"push: "push:"url"}}}])
$addToSet 将值加入一个数组中,会判断是否有重复的值,若相同的值在数组中已经存在了,则不加入。 db.mycol.aggregate([{group : {_id : "by_user", url : {addToSet:"addToSet : "addToSet:"url"}}}])
$first 根据资源文档的排序获取第一个文档数据。 db.mycol.aggregate([{group : {_id : "by_user", first_url : {first:"first : "first:"url"}}}])
$last 根据资源文档的排序获取最后一个文档数据 db.mycol.aggregate([{group : {_id : "by_user", last_url : {last:"last : "last:"url"}}}])

管道的概念

管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。

MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。

表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。

这里我们介绍一下聚合框架中常用的几个操作:

  • $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
  • match:用于过滤数据,只输出符合条件的文档。match:用于过滤数据,只输出符合条件的文档。match:用于过滤数据,只输出符合条件的文档。match使用MongoDB的标准查询操作。
  • $limit:用来限制MongoDB聚合管道返回的文档数。
  • $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
  • $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
  • $group:将集合中的文档分组,可用于统计结果。
  • $sort:将输入文档排序后输出。
  • $geoNear:输出接近某一地理位置的有序文档。

实例

//计算总和$sum:求年龄的总和
db.student.aggregate([
   {
     $group: {
        age: { $sum: "$age" }
     }
   }
])
//计算平均值$avg
db.student.aggregate([
   {
     $group: {
		    _id : "",
        age: { $avg: "$age" }
     }
   }
])
//获取集合中最小文档值$min
db.student.aggregate([
  {
	  $group:{
		  _id:"",
			age:{$min:"$age"}
		}
	}
])
//获取集合中的最大值
db.student.aggregate([
  {
	   $group:{
		   _id:"",
			 age:{$max:"$age"}
		 }
	}
])
//$push将值加入一个数组中,不会判断是否有重复的值。
db.student.update(
   { names: "张三" },
    { 
	   $push: { 
		     scores: { $each: [ 100, 100, 1100 ] } 
				 }
	  }
 )
//$addToSet将值加入一个数组中,$each修饰符添加多个元素
db.student.update(
   { names: "张三" },
    { 
	   $addToSet: { 
		     tags: { $each: [ "camera", "electronics", "accessories" ] } 
				 }
	  }
 )
//$first根据资源文档的排序获取第一个文档数据
db.student.aggregate([
   {
	   $group:{
		   _id:"",
			 names:{$first:"$names"}
		 }
	}
])
//$last根据资源文档的排序获取最后一个文档数据
db.student.aggregate([
   {
	   $group:{
		   _id:"",
			 names:{$last:"$names"}
		 }
	}
])

//按日、按月、按年、按周、按小时、按分钟聚合操作如下:
db.getCollection('m_msg_tb').aggregate(
[
    {$match:{m_id:10001,mark_time:{$gt:new Date(2017,8,0)}}},
    {$group: {
       _id: {$dayOfMonth:'$mark_time'},
        pv: {$sum: 1}
        }
    },
    {$sort: {"_id": 1}}
])

时间关键字如下:

  • $dayOfYear: 返回该日期是这一年的第几天(全年 366 天)。
  • $dayOfMonth: 返回该日期是这一个月的第几天(1到31)。
  • $dayOfWeek: 返回的是这个周的星期几(1:星期日,7:星期六)。
  • $year: 返回该日期的年份部分。
  • $month: 返回该日期的月份部分( 1 到 12)。
  • $week: 返回该日期是所在年的第几个星期( 0 到 53)。
  • $hour: 返回该日期的小时部分。
  • $minute: 返回该日期的分钟部分。
  • $second: 返回该日期的秒部分(以0到59之间的数字形式返回日期的第二部分,但可以是60来计算闰秒)。
  • $millisecond:返回该日期的毫秒部分( 0 到 999)。
  • dateToString: { dateToString: { format: , date: } }。

MongoDB 高级聚合

聚合运算符 序号 运算符 说明 1 add计算数值的总和2add 计算数值的总和 2 add计算数值的总和2divide 给定两个数值,用第一个数除以第二个数 3 mod取模。4mod 取模。 4 mod取模。4multiply 计算数值数组的乘积 5 subtract给定两个数值,用第一个数减去第二个数6subtract 给定两个数值,用第一个数减去第二个数 6 subtract给定两个数值,用第一个数减去第二个数6concat 连接两个字符串 7 strcasecmp比较两个字符串并返回一个整数来反应比较结果8strcasecmp 比较两个字符串并返回一个整数来反应比较结果 8 strcasecmp比较两个字符串并返回一个整数来反应比较结果8substr 返回字符串的一部分 9 toLower将字符串转化为小写10toLower 将字符串转化为小写 10 toLower将字符串转化为小写10toUpper 将字符串转化为大写

//获取stundet集合的names字段及age字段(_id显示)
db.student.aggregate(
    { $project : {
        names: 1 ,
        age : 1 
    }}
 );
//获取stundet集合的names字段及age字段(_id不显示)
db.student.aggregate(
    { $project : {
		    _id:0,
        names: 1 ,
        age : 1 
    }}
 );
//使用$add给age字段的值加10,然后将结果赋值给一个新的字段:newWeight
db.student.aggregate(
    { $project : {
         _id : 0 ,
        names : 1  ,
        age : 1 ,
        newWeight : { $add:["$age", 10] }
    }}
 );
//把weight重命名为newWeight
db.student.aggregate(
    { $project : {
         _id : 0 ,
        name : 1  ,
        age : 1 ,
        newAge : "$age"
    }}
 );

 //获取test集合的weight>=10且weight<=40
db.student.aggregate([
    {$match : 
        { age : 
            { $gte : 10, $lte : 40 } 
        }
    }
]);
//获取stundet集合的weight>=10且weight<=40,然后将符合条件的记录送到下一阶段$group管道操作符进行处理
db.student.aggregate([
    {$match : 
        { age : 
            { $gte : 10, $lte : 40 } 
        }
    },
    { $group: 
        { _id: null, 
          count: { $sum: 1 } 
        } 
    }
]);

avatar

yuanyourdomain

写代码,做研究,记录生活。

RECOMMENDED

MyBatis 动态 SQL

2026-07-08

Nginx 基础入门

2026-07-08

Maven 多模块与私服

2026-07-08