- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章MongoDB中的加减乘除运算详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言 。
很多同学因为对MongoDB不熟悉,加之应用的不是很多,有时候会认为MongoDB数据库对一些功能不支持,或者认为支持不好。今天我们 演示一下 MongoDB对“加减乘除”的使用.
在MongoDB数据库中“加减乘除”运算,又称为 数学表达式(mathematical expression;或算术表达式),主要用于操作数值.
1.$add操作符(+) 。
1.1 语法及功能介绍 。
$add 操作符主要用于将一组数字相加;也可以用于在指定时间上添加一定的时间间隔。时间间隔单位为milliseconds(毫秒).
$add操作符的语法:
{ $add: [ <expression1>, <expression2>, ... ] } 。
这个操作符接受一个或多个表达式作为参数,将这些表达式相加.
1.2 案例演示 。
例如我们有一个sales的集合, 其中有 商品类别 字段、商品价格 字段,商品服务费 字段.
1
2
3
|
{
"_id"
: 1,
"item"
:
"abc"
,
"price"
: 10,
"fee"
: 2,
date
: ISODate(
"2014-03-01T08:00:00Z"
) }
{
"_id"
: 2,
"item"
:
"jkl"
,
"price"
: 20,
"fee"
: 1,
date
: ISODate(
"2014-03-01T09:00:00Z"
) }
{
"_id"
: 3,
"item"
:
"xyz"
,
"price"
: 5,
"fee"
: 0,
date
: ISODate(
"2014-03-15T09:00:00Z"
) }
|
如果有个需求,要统计 商品 的 总费用(price + fee),那么其统计SQL 如下:
1
2
3
4
5
|
db.sales.aggregate(
[
{ $project: { item: 1, total: { $
add
: [
"$price"
,
"$fee"
] } } }
]
)
|
结果显示如下:
{ "_id" : 1, "item" : "abc", "total" : 12 } { "_id" : 2, "item" : "jkl", "total" : 21 } { "_id" : 3, "item" : "xyz", "total" : 5 } 。
现在我们来看下在时间上的$add运算,例如,在上面的集合中,我们想看看商品的 有效日期 ,假如商品的有效日期是在现有的date字段数据 + 3天(注意时间参数的单位为毫秒).
有效日期 命名为 expire_date,则相应的SQL如下:
1
2
3
4
5
|
db.sales.aggregate(
[
{ $project: { item: 1, expire_date: { $
add
: [
"$date"
, 3*24*60*60*1000 ] } } }
]
)
|
结果显示为 :
{ "_id" : 1, "item" : "abc", "expire_date" : ISODate("2014-03-04T08:00:00Z") } { "_id" : 2, "item" : "jkl", "expire_date" : ISODate("2014-03-04T09:00:00Z") } { "_id" : 3, "item" : "xyz", "expire_date" : ISODate("2014-03-18T09:00:00Z") } 。
注:此案例中有关时间的这种运算,在SQL Server 数据库中是通过函数 DATEADD()来实现的.
2.$subtract操作符(-) 。
2.1 语法及功能介绍 。
$subtract操作符是$add的逆运算,它可以计算两个数值的差值;可以计算 2个日期时间的间隔;还可以在指定日期上减去指定的时间间隔。关于时间的计算,参数的单位都是milliseconds(毫秒).
$subtract操作符的语法 。
{ $subtract: [ <expression1>, <expression2> ] } 。
接受两个表达式作为参数,用第一个表达式减去第二个表达式作为结果.
2.2 案例演示 。
将案例1的集合 sales清空,插入以下数据 。
{ "_id" : 1, "item" : "abc", "price" : 10, "fee" : 2, "discount" : 5, "date" : ISODate("2014-03-01T08:00:00Z") } { "_id" : 2, "item" : "jkl", "price" : 20, "fee" : 1, "discount" : 2, "date" : ISODate("2014-03-01T09:00:00Z") } 。
新的数据,添加了 商品打折 的字段 。如果此时统计商品的总费用,则需要 商品价格字段 + 服务费用字段 - 打折字段 。
SQL 语句如下 。
1
|
db.sales.aggregate( [ { $project: { item: 1, total: { $subtract: [ { $
add
: [
"$price"
,
"$fee"
] },
"$discount"
] } } } ] )
|
统计结果显示如下 。
{ "_id" : 1, "item" : "abc", "total" : 7 } { "_id" : 2, "item" : "jkl", "total" : 19 } 。
关于时间的减法运算有2个场景 。
场景1 :计算两个日期的时间间隔(统计单位为毫秒) 。
例如,我们计算sales中商品已生成存在的时间(现在的时间-集合中date字段) 。
1
|
db.sales.aggregate( [ { $project: { item: 1, dateDifference: { $subtract: [ new
Date
(),
"$date"
] } } } ] )
|
结果显示为 。
{ "_id" : 1, "item" : "abc", "dateDifference" : NumberLong("154747094624") } { "_id" : 2, "item" : "jkl", "dateDifference" : NumberLong("154743494624") } 。
注:此案例中关于时间的这种运算,在SQL Server 数据库中是通过函数 DATEDiff()来实现的.
场景2:指定日期上减去一定的时间间隔 。
假如sales集合中的商品一般是规定提前3个小时package的(date字段 --3个小时),那么我们来计算出 这个package_date 。
实现SQL的语句如下 。
1
|
db.sales.aggregate( [ { $project: { item: 1, dateDifference: { $subtract: [
"$date"
, 3 * 60 * 60 * 1000 ] } } } ] )
|
结果显示如下 。
{ "_id" : 1, "item" : "abc", "dateDifference" : ISODate("2014-03-01T05:00:00Z") } { "_id" : 2, "item" : "jkl", "dateDifference" : ISODate("2014-03-01T06:00:00Z") } 。
注:此案例中关于时间的这种运算,在SQL Server数据库中是通过函数 DATEADD()来实现的.
3.$multiply操作符(*) 。
3.1 语法及功能介绍 。
$multiply操作符主要用来一组数值相乘.
$multiplyt操作符的语法 。
{ $multiply: [ <expression1>, <expression2>, ... ] } 。
接受一个或多个表达式,并将它们相乘.
3.2 案例演示 。
将案例2的集合 sales清空,插入以下数据 。
{ "_id" : 1, "item" : "abc", "price" : 10, "quantity": 2, date: ISODate("2014-03-01T08:00:00Z") } { "_id" : 2, "item" : "jkl", "price" : 20, "quantity": 1, date: ISODate("2014-03-01T09:00:00Z") } { "_id" : 3, "item" : "xyz", "price" : 5, "quantity": 10, date: ISODate("2014-03-15T09:00:00Z") } 。
在这个商品销售集合中,有商品的价格字段,还有商品数量字段,我们需要统计出,每个商品的总额(商品价格*商品数据量) 。
统计的SQL语句:
1
2
3
4
5
|
db.sales.aggregate(
[
{ $project: { item: 1, total_price: { $multiply: [
"$price"
,
"$quantity"
] } } }
]
)
|
结果显示如下
{ "_id" : 1, "item" : "abc", "total_price" : 20 } { "_id" : 2, "item" : "jkl", "total_price" : 20 } { "_id" : 3, "item" : "xyz", "total_price" : 50 } 。
4.$divide操作符(/) 。
4.1 语法及功能介绍 。
$divide操作符主要用来2个数字相除.
$divide操作符的语法为:
{ $divide: [ <expression1>, <expression2> ] } 。
接受两个表达式,将第一个表达式除以第二个表达式的商作为结果.
4.2 案例演示 。
例如我们有一个关于项目计划的集合planning , 在这个集合中 有关于耗时的字段 hours,数据格式如下.
{ "_id" : 1, "name" : "A", "hours" : 80, "resources" : 7 }, { "_id" : 2, "name" : "B", "hours" : 40, "resources" : 4 } 。
上面的数据是安照工时统计的,如果我们安照工作日统计(工时/8),其SQL语句如下:
1
2
3
4
5
|
db.planning.aggregate(
[
{ $project: {
name
: 1, workdays: { $divide: [
"$hours"
, 8 ] } } }
]
)
|
结果显示如下:
{ "_id" : 1, "name" : "A", "workdays" : 10 } { "_id" : 2, "name" : "B", "workdays" : 5 } 。
5 求余 运算($mod) 。
讲到除法运算,自然就会想到求余的运算(%),下面我们简单介绍以下求余运算符$mod.
5.1 语法及功能介绍 。
语法:
{ $mod: [ <expression1>, <expression2> ] } 。
接受两个表达式,将第一个表达式除以第二个表达式得到的余数作为结果.
5.2 案例演示 。
还是上面的关于任务计划的集合,上面有工时字段,还有任务字段,数据格式如下:
{ "_id" : 1, "project" : "A", "hours" : 80, "tasks" : 7 } { "_id" : 2, "project" : "B", "hours" : 40, "tasks" : 4 } 。
我们统计每个任务平均后,剩余的时间,SQL语句如下:
1
2
3
4
5
|
db.planning.aggregate(
[
{ $project: { remainder: { $mod: [
"$hours"
,
"$tasks"
] } } }
]
)
|
结果显示如下:
{ "_id" : 1, "remainder" : 3 } { "_id" : 2, "remainder" : 0 } 。
6.案例分析 。
在文章的最后一节,我们用一个例子,巩固一下上面的学习,同时引入另外一个知识点----逻辑表达式.
6.1 案例探究 。
假如有个大学教授想通过某种比较复杂的计算为他的学生打分:出勤率占10%,日常测验成绩占30%,期末考试成绩占60%,但如果是老师宠爱的学生,那么分数就是100. 。
关于学生students集合的数据格式如下 。
1
2
3
|
{
"_id"
: 1,
"sno"
: 201501010001,
"name"
:
"xiaoming"
,
"attendanceAvg"
: 90,
"quizzAvg"
: 95,
"testAvg"
: 98,
"teacherPet"
:
true
}
{
"_id"
: 2,
"sno"
: 201501010002,
"name"
:
"xiaoli"
,
"attendanceAvg"
: 100,
"quizzAvg"
: 90,
"testAvg"
: 90,
"teacherPet"
:
false
}
{
"_id"
: 3,
"sno"
: 201501010003,
"name"
:
"xiaohong"
,
"attendanceAvg"
: 100,
"quizzAvg"
: 80,
"testAvg"
: 100,
"teacherPet"
:
false
}
|
满足此教授老师需求的查询SQL语句如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
db.students.aggregate(
[
{
$project:
{
"sno"
: 1,
"name"
: 1,
grade:
{
$cond: [
"$teacherPet"
, 100, {
"$add"
:
[
{
"$multiply"
: [
"$attendanceAvg"
, .1] },
{
"$multiply"
: [
"$quizzAvg"
, .3] },
{
"$multiply"
: [
"$testAvg"
, .6] }
]
}]
}
}
}
]
)
|
查询的结果如下 。
{ "_id" : 1, "sno" : 201501010001, "name" : "xiaoming", "grade" : 100 } { "_id" : 2, "sno" : 201501010002, "name" : "xiaoli", "grade" : 91 } { "_id" : 3, "sno" : 201501010003, "name" : "xiaohong", "grade" : 94 } 。
在本例中我们不仅用到了数学表达式$add,$$multiply,还用到了逻辑表达式$cond(if 老师宠爱的学生 就100,否则 计算分数...)。下面,我们粗略讲解一下关于 MongoDB的逻辑表达式.
6.2 常用逻辑表达式 。
。
类别 。 |
操作符 。 |
语法 。 |
功能用途 。 |
布尔表达式 。 |
$and 。 |
{$and: [ <expression1>, <expression2>, ... ]} 。 |
如果所有表达式的值为true,那就返回true,否则返回false. |
$or 。 |
{$or: [ <expression1>, <expression2>, ... ]} 。 |
只要有任意表达式的值为true,那就返回true,否则返回false. |
|
$not 。 |
{ $not: [ <expression> ] } 。 |
对expression取反. |
|
控制表达式 。 |
$cond 。 |
{ $cond: { if: <boolean-expression>, then: <true-case>, else: <false-case-> } } 或者 { $cond: [ <boolean-expression>, <true-case>, <false-case> ] } 。 |
如果boolean-expression为的值是true,那就返回true-case,否则返回false-case. |
$ifNull 。 |
{ $ifNull: [ <expression>,<replacement-expression-if-null> ] } 。 |
如果expression是null,那就返回replacement-expression-if-null,否则返回expression. |
|
比较表达式 。 |
$cmp 。 |
{ $cmp: [ <expression1>,<expression2> ] } 。 |
比较expression1和expression2,如果相等,返回0;如果前者大于后者,返回一个正数1;如果前者小于后者。返回一个负数-1. |
$strcasecmp 。 |
{ $strcasecmp: [<expression1>,<expression2> ] } 。 |
$cmp的细化。用来比较expression1和expression2;区分大小写,主要针对ASCII characters。如果相等,返回0;如果前者大于后者,返回一个正数1;如果前者小于后者。返回一个负数-1. |
|
$eq/$ne/$gt/$gte/$lt/$lte 。 |
$eq/$ne/$gt/$gte/$lt/$lte :[ <expression1>,<expression2> ] 。 |
对expression1和expression2执行相应的比较操作,返回比较的结构(true或false). |
。
通过这些操作符,就可以在聚合中使用更复杂的逻辑.
总结 。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我的支持.
原文链接:http://www.cnblogs.com/xuliuzai/p/10321650.html 。
最后此篇关于MongoDB中的加减乘除运算详解的文章就讲到这里了,如果你想了解更多关于MongoDB中的加减乘除运算详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
全称“Java Virtual Machine statistics monitoring tool”(statistics 统计;monitoring 监控;tool 工具) 用于监控虚拟机的各种运
主要是讲下Mongodb的索引的查看、创建、删除、类型说明,还有就是Explain执行计划的解释说明。 可以转载,但请注明出处。  
1>单线程或者单进程 相当于短链接,当accept之后,就开始数据的接收和数据的发送,不接受新的连接,即一个server,一个client 不存在并发。 2>循环服务器和并发服务器
详解 linux中的关机和重启命令 一 shutdown命令 shutdown [选项] 时间 选项: ?
首先,将json串转为一个JObject对象: ? 1
matplotlib官网 matplotlib库默认英文字体 添加黑体(‘SimHei')为绘图字体 代码: plt.rcParams['font.sans-serif']=['SimHei'
在并发编程中,synchronized关键字是常出现的角色。之前我们都称呼synchronized关键字为重量锁,但是在jdk1.6中对synchronized进行了优化,引入了偏向锁、轻量锁。本篇
一般我们的项目中会使用1到2个数据库连接配置,同程艺龙的数据库连接配置被收拢到统一的配置中心,由DBA统一配置和维护,业务方通过某个字符串配置拿到的是Connection对象。  
实例如下: ? 1
1. MemoryCahe NetCore中的缓存和System.Runtime.Caching很相似,但是在功能上做了增强,缓存的key支持object类型;提供了泛型支持;可以读缓存和单个缓存
argument是javascript中函数的一个特殊参数,例如下文,利用argument访问函数参数,判断函数是否执行 复制代码 代码如下: <script
一不小心装了一个Redis服务,开了一个全网的默认端口,一开始以为这台服务器没有公网ip,结果发现之后悔之莫及啊 某天发现cpu load高的出奇,发现一个minerd进程 占了大量cpu,googl
今天写这个是为了 提醒自己 编程过程 不仅要有逻辑 思想 还有要规范 代码 这样可读性 1、PHP 编程规范与编码习惯最主要的有以下几点: 1 文件说明 2 funct
摘要:虚拟机安装时一般都采用最小化安装,默认没有lspci工具。一台测试虚拟网卡性能的虚拟机,需要lspci工具来查看网卡的类型。本文描述了在一个虚拟机中安装lspci工具的具体步骤。 由于要测试
1、修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统
目录 算术运算符 基本四则运算符 增量赋值运算符 自增/自减运算符 关系运算符 逻
如下所示: ? 1
MapperScannerConfigurer之sqlSessionFactory注入方式讲解 首先,Mybatis中的有一段配置非常方便,省去我们去写DaoImpl(Dao层实现类)的时间,这个
Linux的网络虚拟化是LXC项目中的一个子项目,LXC包括文件系统虚拟化,进程空间虚拟化,用户虚拟化,网络虚拟化,等等,这里使用LXC的网络虚拟化来模拟多个网络环境。 本文从基本的网络设备讲
? 1
我是一名优秀的程序员,十分优秀!