可以比较mongodb中的日期字符串吗?

时间:2014-03-20 22:48:40

标签: javascript mongodb mongodb-query aggregation-framework

我有一个包含日期属性的文档的集合:

{
   title: "whatever",
   created: ISODate("2013-05-27T03:36:50Z")
}

我想选择某一天创建的记录。我希望我可以使用toDateString()并比较值,但是当我进行如下搜索时:

db.myCollection.find({' created.toDateString()':new Date(' 05/27/2013')。toDateString()})。pretty()

但这不起作用。有没有办法做我上面尝试的事情?

1 个答案:

答案 0 :(得分:2)

如果要选择记录,请使用日期范围:

db.collection.find({
    created: { "$gte": new Date("2013-05-27"), "$lt": new Date("2013-05-28") }
})

选择所有包含的小时,分​​钟等,落在两个日期之间。

所以应该尝试使用日期值而不是强制转换为字符串。

如果您希望以此方式进行汇总或以其他方式需要以仅限日期格式生成结果,请使用$project和日期operators执行此操作:

db.collection.aggregate([
    // Still match on the normal date forms, this time whole month
    { "$match": {
        created: { 
           "$gte": new Date("2013-05-01"), 
           "$lt": new Date("2013-05-31") 
        }
    }},

    // Project the date
    { "$project": {
        "date": {
            "year"  : { "$year"  : "$created" },
            "month" : { "$month" : "$created" },
            "day":  : { "$dayOfMonth": "$created" }
        },
        "title": 1
    }},

    // Group on day and title
    { "$group": {
        "_id": {
            "date"  : "$date",
            "title" : "$title"
        },
        "count": { "$sum": 1 }
    }},

    // Sort by date
    { "$sort": { 
        "_id.date.year": 1,
        "_id.date.month": 1,
        "_id.date.day": 1,
    }},

    // Project nicer dates and document
    { "$project": {
        "_id": 0,
        "date": { "$concat": [
            { "$substr": [ "$_id.date.year", 0, 4 ] },
            "-",
            { "$substr": [ "$_id.date.month", 0, 2 ] },
            "-",
            { "$substr": [ "$_id.date.day", 0, 2 ] }
        ]},
        "title": "$_id.title",
        "count": 1
    }}
])