如何从mongo集合中获取最后一周的数据,其中日期以字符串格式存储?

时间:2018-03-19 06:43:22

标签: string mongodb date

我使用的是mongoDB版本3.4 我有一个集合,其中日期以字符串格式YYYY-mm-dd存储。我需要从这个集合中获取上周的数据。

new Date(new Date().setDate(new Date().getDate()-7)) 

以ISO日期格式返回日期,不能用于与字符串格式的日期进行比较 我不能使用日期格式化程序,因为版本3.4不支持 有没有办法让当前日期是字符串格式并在查询中使用它? 而且,我只需要日期,没有时间戳。

3 个答案:

答案 0 :(得分:0)

我可以想到几种方法。

最简单的方法是计算上周的不同日期,将它们转换为YYYY-MM-DD格式,然后只比较字符串。

var listOfDates = ["2018-02-19","2018-02-18","2018-02-17","2018-02-16"]

collection.find(date:{$in:listOfDates})

<强>替代:
将所有日期转换为标准ISODate类型,然后使用普通查询。转换只会是一次,这是正确的做法。您甚至可以使用索引来获得更快的结果。

db.mycol.find({}).forEach(function(doc){
    doc.date = new Date(doc.date)    
    db.mycol.save(doc);    
})

这会将{"date" : "2018-02-19"}转换为{"date" : ISODate("2018-02-19T00:00:00Z")}

请注意,"2018-02-19"将是UTC日期,因此您可能需要根据您的时区进行一些转换。

答案 1 :(得分:0)

检查

var today = new Date();
var first = today.getDate() - today.getDay();
var firstDayWeek = new Date(today.setDate(first));
var lastDayWeek = new Date(today.setDate(first + 6));


db.getCollection('Collection').aggregate([{
    $project: {
        date: {
            $dateFromString: {
                dateString: '$date'
            }
        }
    }
}, {
    $match: {
        "date": {
            $lt: lastDayWeek,
            $gt: firstDayWeek
        }
    }
}])

<强>输出

{
    "_id" : ObjectId("5aaf77510f1ae49ecac9c1a7"),
    "date" : ISODate("2018-03-20T00:00:00.000Z")
}

答案 2 :(得分:0)

        var week_1 = new Date(); // current date

//这里你可以使用当前日期的日期

        var pastDate = week_1.getDate() - 7;
        week_1.setDate(pastDate);
         

        collection.find({"createdAt": {
                $gte: week_1
            }})