我知道有很多关于这个主题的例子,但是几乎所有的例子都与新的日期或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
}
有人可以帮助我吗?
提前致谢。
答案 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 部分的手册。