如何在mongoDB

时间:2015-07-23 11:13:02

标签: mongodb

我知道有很多关于这个主题的例子,但是几乎所有的例子都与新的日期或ISODATE()输入有关,而我的问题是不同的。

我在mongoDB中有一个现有数据库,我试图减去两个日期以毫秒为单位转换这些日期并减去它们。我正在做这个项目:

{$project:{
    _id:0,
    'CrtDat':1,
    'CloDat':1,
    "CrtMs": { $millisecond: "$CrtDat" },
    "CloMs": { $millisecond: "$CloDat" },
    "TotalTime": {$subtract: ["$CloMs", "$CrtMs"] }
}},

我的完整文档查询:

db.tickets.aggregate([
{$match:{
    'Nms.Org': 'Org',
    'Nms.Cmp':'Company'
    }},
{$project:{
    _id:0,
    'CrtDat':1,
    'CloDat':1,
    'Nms.Org':1,
    'Nms.Cmp':1,

    }},

    {$group:
    {_id:{
            Org:'$Nms.Org',
            Cmp:'$Nms.Cmp',
            CrtDate:'$CrtDat',
            CloDate:'$CloDat' 
            },
            Total_Closed:{$sum:1}
        },

    },
    { $project : {
        Total_Closed : 1

  }}, 

])

显然我可以在TotalTime中看到:CloMS-CrtMS以毫秒为单位,但robomongo检索到以下错误消息:

Error("Printing Stack Trace")@:0
()@src/mongo/shell/utils.js:37
([object Array])@src/mongo/shell/collection.js:866
@(shell):90

uncaught exception: aggregate failed: {
    "errmsg" : "exception: can't convert from BSON type NULL to Date",
    "code" : 16006,
    "ok" : 0
}

似乎我的约会CrtDat和CloDat是NULL但是如果我做db.tickets.findOne()(我的收集称为门票)我可以看到这两个日期都喜欢这个:

Key                     Value                             Type
----------------------------------------------------------------
CrtDat                  2015-05-01 03:36:42.000Z          Date
CloDat                  2015-05-07 09:52:35.000Z          Date

我的输出:

{
    "_id" : {
        "Org" : "Org",
        "Cmp" : "Company",
        "Wkg" : "Wkg",
        "CurEntNme" : "Entity",
        "CurTskId" : 1,
        "DueDate" : ISODate("2014-11-12T16:01:54.000Z"),
        "CrtDate" : ISODate("2014-11-10T22:01:50.000Z"),
        "CloDate" : ISODate("2014-11-19T00:15:49.000Z")
    },
    "Total_Closed" : 1
}

有人可以帮助我吗?

提前致谢。

1 个答案:

答案 0 :(得分:4)

您可以尝试使用 {{3中的 $mod $subtract 运算符将日期时间字段转换为时间戳管道。

假设您的最小测试用例如下:

db.test.insert(
    {
        CrtDat: ISODate("2015-05-01T03:36:42.962Z"),
        CloDat: ISODate("2015-05-07T09:52:35.517Z")
    }
)

以下聚合管道将为您提供两个日期时间字段之间的毫秒差异:

db.test.aggregate([
    {
        "$project": {
            "_id": 0,
            'CrtDat':1,
            'CloDat':1,
            "TotalTime": { 
                "$subtract": [                     
                    {                
                        "$subtract": [ "$CloDat", new Date(0) ] 
                    },
                    {                
                        "$subtract": [ "$CrtDat", new Date(0) ] 
                    }
                ] 
            },                     
            "TestTotalTime": { 
                "$subtract": [                     
                    {                
                        "$subtract": [
                            { 
                                "$subtract": [ "$CloDat", new Date(0) ] 
                            },
                            { 
                                "$mod": [
                                    { "$subtract": [ "$CloDat", new Date(0) ] },
                                    5 * 60 * 1000
                                ]
                            }
                        ]
                    },
                    {                
                        "$subtract": [
                            { 
                                "$subtract": [ "$CrtDat", new Date(0) ] 
                            },
                            { 
                                "$mod": [
                                    { "$subtract": [ "$CrtDat", new Date(0) ] },
                                    5 * 60 * 1000
                                ]
                            }
                        ]
                    }
                ] 
            }
        }
    }    
])

示例输出

/* 0 */
{
    "result" : [ 
        {
            "CrtDat" : ISODate("2015-05-01T03:36:42.962Z"),
            "CloDat" : ISODate("2015-05-07T09:52:35.517Z"),
            "TotalTime" : 540952555,
            "TestTotalTime" : 540900000
        }
    ],
    "ok" : 1
}

有关更多示例,请参阅 $project Subtract Two Dates 部分的手册。