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 : {likes"}}}]) |
| $avg | 计算平均值 | db.mycol.aggregate([{group : {_id : "by_user", num_tutorial : {likes"}}}]) |
| $min | 获取集合中所有文档对应值得最小值。 | db.mycol.aggregate([{group : {_id : "by_user", num_tutorial : {likes"}}}]) |
| $max | 获取集合中所有文档对应值得最大值。 | db.mycol.aggregate([{group : {_id : "by_user", num_tutorial : {likes"}}}]) |
| $push | 将值加入一个数组中,不会判断是否有重复的值。 | db.mycol.aggregate([{group : {_id : "by_user", url : {url"}}}]) |
| $addToSet | 将值加入一个数组中,会判断是否有重复的值,若相同的值在数组中已经存在了,则不加入。 | db.mycol.aggregate([{group : {_id : "by_user", url : {url"}}}]) |
| $first | 根据资源文档的排序获取第一个文档数据。 | db.mycol.aggregate([{group : {_id : "by_user", first_url : {url"}}}]) |
| $last | 根据资源文档的排序获取最后一个文档数据 | db.mycol.aggregate([{group : {_id : "by_user", last_url : {url"}}}]) |
管道的概念
管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。
这里我们介绍一下聚合框架中常用的几个操作:
- $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
- 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 divide 给定两个数值,用第一个数除以第二个数 3 multiply 计算数值数组的乘积 5 concat 连接两个字符串 7 substr 返回字符串的一部分 9 toUpper 将字符串转化为大写
//获取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 }
}
}
]);