Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mongodb中按时间戳日期聚合数据_Mongodb_Timestamp_Aggregation Framework - Fatal编程技术网

在mongodb中按时间戳日期聚合数据

在mongodb中按时间戳日期聚合数据,mongodb,timestamp,aggregation-framework,Mongodb,Timestamp,Aggregation Framework,我正在以unix时间戳格式存储项目的创建时间。现在我想把它加起来,比如说,根据年份。但是,不幸的是,它不起作用,因为它应该 以下是源数据: db.invoice.find({id:'01F96C0D425CDD69692D97C3909FB6DFF75066B'},{created:1,amount:1}) {“_id”:ObjectId(“534801e8e71709fab334bdd9”),“金额”:345,“创建”:1397661552} 但当我尝试这样做时: db.invoice.ag

我正在以unix时间戳格式存储项目的创建时间。现在我想把它加起来,比如说,根据年份。但是,不幸的是,它不起作用,因为它应该

以下是源数据:

db.invoice.find({id:'01F96C0D425CDD69692D97C3909FB6DFF75066B'},{created:1,amount:1})
{“_id”:ObjectId(“534801e8e71709fab334bdd9”),“金额”:345,“创建”:1397661552}
但当我尝试这样做时:

db.invoice.aggregate(
{$match:{id:'01F96C0D425CDD69692D97C3909FB6DFF75066B'},
{$group:
{{u id:{year:{$year:新日期('$created'*1000)},
总计:{$sum:'$amount'}
}
)
我明白了

“结果”:[
{
“_id”:{
“年份”:292278994
},
“总数”:345
}
],
“好”:1
这一年很奇怪

注意:如果我在日期函数中指出准确时间:

db.invoice.aggregate(
{$match:{id:'01F96C0D425CDD69692D97C3909FB6DFF75066B'},
{$group:
{{u id:{year:{$year:新日期(1397661552000)},
总计:{$sum:'$amount'}
}
)
它似乎在2014年正常工作,并且输出了操作员和所有操作员完全按照设计工作。但这里的问题是,您的“created”实际上不是一个数字,实际上只是一个表示历元时间戳的数字

所以如果你真的有一个壳,壳中会是这样的:

ISODate(“2014-04-18T03:54:40.023Z”)
然后操作员将工作。但在您的情况下,它们没有,这是一个遗憾,因为BSON日期类型实际上只是内部的一个历元时间戳,因此不会占用任何额外的存储空间

但由于你的“时间戳”只是数字,你只需要做一点“日期数学”就可以得到你想要的年份边界:

db.invoice.aggregate([
{“$组”:{
“_id”:{
“$add”:[
{“$subtract”:[
“$created”,
{“$mod”:[
“$created”,
31536000         // 60 * 60 * 24 * 365
]}
]},
950400//校正
]
},
“总计”:{“$sum”:“$amount”}
}}
])
这应该将每个日期值设置为它所在年份的第一天,这样就可以按年份进行聚合

“结果”:[
{
“_id”:{
“年份”:1388534400
},
“总数”:345
}
],
“好”:1

您可以在站点上检查结果中的纪元日期,或者将其输入到日期对象中。

在第一个示例中,为什么要将“$created”乘以1000,而在第二个示例中只传递1397661552?这是打印错误,抱歉