Cannot use $dayOfMonth aggregate with expression

无人久伴 提交于 2019-12-11 05:56:42

问题


So, I need to extract the day-of-week for some objects to make some aggregations. But all my documents have is a timestamp, not a Date. So I'm trying to use $dayOfMonth (and others) with an expression, I can't figure out what it is not working.

Here is my query (along with a helper function to create my date from the timestamp):

db.Logging.aggregate([
    {
        $match: {
            "timestamp": { $gte: dateToTimestamp("2017-04-10") }
        }
    },
    {
        $project: { 
            _id: 0,
            timestamp: "$timestamp",
            dia: { $dayOfMonth: myDate("$timestamp") }
        }
    }
])

function dateToTimestamp(str) {
    let d = new Date( str );
    return d.getTime() + d.getTimezoneOffset()*60*1000;
}

function myDate( ts) {
    var d = new ISODate();
    d.setTime( ts );
    return d;
}

The problem seems to be in passing the value of $timestamp to the myDate function. If I use a literal (e.g. 1492430243) either as the value of ts inside the function or as the value of the parameter passed to myDate it works fine.

In other words: this $dayOfMonth: myDate("1492430243") works.

Although a solution has been shown to work here (Mongodb aggregation by day based on unix timestamp - a pretty ugly solution, if I may add), I want to know why my solution doesn't. As per mongodb docs, $dayOfMonth works with Date types, my function returns a date, so what is wrong?

来源:https://stackoverflow.com/questions/43451053/cannot-use-dayofmonth-aggregate-with-expression

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!