MongoDB $subtract操作符

MongoDB $subtract操作符

MongoDB提供了各种算术表达式操作符。$subtract操作符是其中之一。该操作符用于对两个数字或日期进行减法运算,并返回差值。

  1. 如果参数是两个数字,则结果将是一个数字。
  2. 如果参数是两个日期,则结果将以毫秒表示。
  3. 如果参数是一个日期和一个以毫秒表示的数字,则结果将以日期表示。

$subtract操作符的语法

{ $subtract: [ < expression 1 >, < expression 2 > ] }

注意: 参数必须是有效的表达式,如数字或日期。在此运算符中,第二个参数减去第一个参数。如果要从日期中减去一个数字,第一个参数应始终是一个日期。

示例

假设我们有一个包含以下文档的学生集合。

>db.students.find().pretty()
{
         {
             "_id" : 1,
             "std_name" : "John",
             "father_name" : "Mick",
             "department" : "MCA",
             "semester_fee" : 6000,
             "annual_fee" : 10000,
             "start_date" : ISODate("2019-07-03T08:00:00Z"),
             "end_date" : ISODate("2021-05-26T09:00:00Z")
         }
         {
             "_id" : 2,
             "std_name" : "Oliver",
             "father_name" : "Thomas",
             "department" : "BCA",
             "semester_fee" : 4000,
             "annual_fee" : 6000,
             "start_date" : ISODate("2020-07-03T08:00:00Z"),
             "end_date" : ISODate("2023-05-01T09:00:00Z")
         }
         {
             "_id" : 3,
             "std_name" : "Jack",
             "father_name" : "James",
             "department" : "MCA",
             "semester_fee" : 7000,
             "annual_fee" : 12500,
             "start_date" : ISODate("2020-07-11T00:00:00Z"),
             "end_date" : ISODate("2022-05-25T09:00:00Z")
         }
         {
             "_id" : 4,
             "std_name" : "Robert",
             "father_name" : "David",
             "department" : "Btech",
             "fees" : {
                        "semester_fee" : 15000,
                        "annual_fee" : 22500
                      }
             "start_date" : ISODate("2018-07-11T08:00:00Z"),
             "end_date" : ISODate("2022-05-25T09:00:00Z")
         }
         {
             "_id" : 5,
             "std_name" : "Richard",
             "father_name" : "William",
             "department" : "BCA",
             "semester_fee" : 11500,
             "annual_fee" : 20000,
             "start_date" : ISODate("2020-07-03T08:00:00Z"),
             "end_date" : ISODate("2023-05-01T09:00:00Z")
         }
         {
             "_id" : 6,
             "std_name" : "Daniel",
             "father_name" : "Paul",
             "department" : "MCA",
             "semester_fees" : 12500,
             "annual_fee" : 25000,
             "start_date" : ISODate("2018-07-11T08:00:00Z"),
             "end_date" : ISODate("2020-05-25T09:00:00Z")
         }
}

示例1:使用$subtract运算符减去两个数字

在这个示例中,我们将使用$subtract运算符,从annual_fee字段中减去semester_fee字段。

db.students.aggregate(
 [
   {match: { department : "MCA" }},
      {project: 
              {
                std_name : 1,
                father_name : 1,
                semester_fee : 1,
                annual_fee : 1,
                result : { subtract : [ "annual_fee", "$semester_fee" ] }
               }
      }
 ]
)

输出:

{
    "_id" : 1,
    "std_name" : "John",
    "father_name" : "Mick",
    "semester_fee" : 6000,
    "annual_fee" : 10000,
    "result" : 4000
}    
{
    "_id" : 3,
    "std_name" : "Jack",
    "father_name" : "James",
    "semester_fee" : 7000,
    "annual_fee" : 12500,
    "result" : 5500
}
{
    "_id" : 6,
    "std_name" : "Daniel",
    "father_name" : "Paul",
    "semester_fee" : 12500,
    "annual_fee" : 25000,
    "result" : 12500
}

示例2:使用$subtract运算符计算两个日期的差

在此示例中,我们将使用$subtract运算符从”end_date”字段中减去”start_date”字段。

db.students.aggregate(
 [
   {match: { department : "BCA" }},
      {project: 
              {
                std_name : 1,
                father_name : 1,
                start_date : 1,
                end_date : 1,
                result : { subtract : [ "end_date ", "$start_date" ] }
               }
      }
 ]
)

输出:

{
      "_id" : 2,
      "std_name" : "Oliver",
      "father_name" : "Thomas",
      "start_date" : ISODate("2020-07-03T08:00:00Z"),
      "end_date" : ISODate("2023-05-01T09:00:00Z"),
      "result" : NumberLong("18644531576187")
}
{
      "_id" : 5,
      "std_name" : "Richard",
      "father_name" : "William",
      "start_date" : ISODate("2019-07-03T08:00:00Z"),
      "end_date" : ISODate("2022-05-01T09:00:00Z"),
      "result" : NumberLong("18644531576187")
}

示例3:使用$subtract运算符从日期中减去一个数字

在这个示例中,我们将使用$subtract运算符从”start_date”字段中减去250。

db.students.aggregate(
 [
   {match: { std_name : "Jack" }},
      {project: 
              {
                std_name : 1,
                father_name : 1,
                department : 1,
                start_date : 1,
                result : { subtract : [ "start_date", 250 ] }
               }
      }
 ]
)

输出:

{
             "_id" : 3,
             "std_name" : "Jack",
             "father_name" : "James",
             "department" : "MCA",
             "start_date" : ISODate("2020-07-11T00:00:00Z"),
             "result" : ISODate("2020-07-10T23:59:59.750Z") 
}

我们可以看到”start_date”字段减去了250毫秒。 如果我们改变参数的位置会发生什么?

db.students.aggregate(
 [
   {match: { std_name : "Jack" }},
      {project: 
              {
                std_name : 1,
                father_name : 1,
                department : 1,
                start_date : 1,
                result : { subtract : [ 250, "start_date" ] }
               }
      }
 ]
)

输出:

uncaught exception : Error : command failed : {
    "ok": 0,
    "errmsg": "cant $subtract a date from a double",
    "code": 16556,
    "codeName": "Location16556"
} : aggregate failed:
_getErrorWithCode@src/mongo/shell/utils.js : 25 : 13
doassert@src/mongo/shell/assert.js : 18 : 14
_assertCommandWorked@src/mongo/shell/assert.js : 618 : 17
assert.commandWorked@src/mongo/shell/assert.js : 708 : 16
DB.prototype._runAggregate@src/mongo/shell/db.js : 266 : 5
DBCollection.prototype.aggregate@src/mongo/shell/collection.js : 1046 : 12
@(shell) : 1 : 1

如您所见,如果第一个参数是一个数字并且第二个参数是一个日期,我们会得到一个错误。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程