Mongodb如何从时间戳字段中查找多少天前

Mongodb如何从时间戳字段中查找多少天前,mongodb,timestamp,days,Mongodb,Timestamp,Days,我试着用时间戳找到几天前的数字,但我不知道怎么做 { "_id" : ObjectId("5504cc9ddd5af617caae30b3"), "session_id" : 1, "Timestamp" : "2014-04-07T10:51:09.277Z", "Item_ID" : 214536502, "Category" : 0 } 如何使用时间戳字段计算前几天的天数?您可以在时间戳字段中使用aggregate$project with new

我试着用时间戳找到几天前的数字,但我不知道怎么做

{
    "_id" : ObjectId("5504cc9ddd5af617caae30b3"),
    "session_id" : 1,
    "Timestamp" : "2014-04-07T10:51:09.277Z",
    "Item_ID" : 214536502,
    "Category" : 0
}
如何使用时间戳字段计算前几天的天数?

您可以在时间戳字段中使用aggregate$project with new Date,然后进行计算,如下所示:

pipe = {
    "$project" : {
        "_id" : 1,
        "daySince" : {
            "$divide" : [
                {
                    "$subtract" : [
                        new Date(),
                        new Date("$Timestamp")
                    ]
                },
                86400000
            ]
        }
    }
}
计算:

db.collection.aggregate(pipeline=pipe)
由于Timestamp不是ISODate对象,您只需将其转换为一,然后减去当前日期,然后将结果除以60*60*24*1000,那么它将是从今天开始的天数

您还可以将新日期更改为需要比较的日期

更新: 由于我认为时间戳格式可能不正确,您也可以使用mapReduce函数来计算:

// in your mongo shell using the db

var mapTimestamp = function() { 
    daySince = parseInt(new Date() - new Date(this.Timestamp) / 86400000);
    emit(this._id, daySince); 
}
// since you map reduce only on one field, there's really no need for this
var reduceTimestamp = function (key, value) { return value; }

db.collection.mapReduce(mapTimestamp, reduceTimestamp, {out: "sample"})
要显示结果,请执行以下操作:

db.sample.find()
您可以在Timestamp字段中使用aggregate$project和new Date,然后进行计算,如下所示:

pipe = {
    "$project" : {
        "_id" : 1,
        "daySince" : {
            "$divide" : [
                {
                    "$subtract" : [
                        new Date(),
                        new Date("$Timestamp")
                    ]
                },
                86400000
            ]
        }
    }
}
计算:

db.collection.aggregate(pipeline=pipe)
由于Timestamp不是ISODate对象,您只需将其转换为一,然后减去当前日期,然后将结果除以60*60*24*1000,那么它将是从今天开始的天数

您还可以将新日期更改为需要比较的日期

更新: 由于我认为时间戳格式可能不正确,您也可以使用mapReduce函数来计算:

// in your mongo shell using the db

var mapTimestamp = function() { 
    daySince = parseInt(new Date() - new Date(this.Timestamp) / 86400000);
    emit(this._id, daySince); 
}
// since you map reduce only on one field, there's really no need for this
var reduceTimestamp = function (key, value) { return value; }

db.collection.mapReduce(mapTimestamp, reduceTimestamp, {out: "sample"})
要显示结果,请执行以下操作:

db.sample.find()

我不知道为什么它会给我这个:/*0*/{$project:{{u id:1,daybash:{$divide:[{$subtract:[ISODate1970-01-01T00:00:00.000Z,ISODate1970-01-01T00:00:00.000Z]},86400000]}}}}@majdsoud,你是在mongo shell还是你没有提到的Python或JavaScript之类的客户机上?我通过Robomongo@majdsoud使用mongo shell,嘿,刚刚看到你的评论,我想可能是因为时间戳格式错误,无法转换为mongo Date,您可以通过mapReduce使用javascript函数来执行此操作。我已经在本地测试了它,虽然在本地上述两种方法都适用于我,但它仍然有效。试试看,如果没有,请告诉我。这给出了一个非常好的近似值。然而,如果您想在时区方面做到超精确,它可能并不总是精确的。例如,在欧洲/巴黎时区,2019-03-31和2019-04-01之间只有23个小时。我不知道为什么它会给我这个:/*0*/{$project:{{u id:1,daybash:{$divide:[{$subtract:[ISODATE 1970-01-01T00:00:00.000Z,ISODATE 1970-01-01T00:00:00.000Z]},86400000]}@majdsoud,你是在mongo shell还是你没有提到的Python或JavaScript之类的客户端?我正在通过Robomongo@majdsoud使用mongo shell,嘿,刚刚看到你的评论,我猜可能是由于时间戳格式错误,无法转换为mongo日期,你可以通过mapReduce使用JavaScript函数来实现。我已经在lo测试过它凯莉,虽然上述两种方法在本地对我都有效。试试看,如果没有,请告诉我。这提供了一个非常好的近似值。但是,如果你想对时区进行超精确计算,它可能并不总是精确的。例如,在欧洲/巴黎时区,2019-03-31和2019-04-01之间只有23个小时。