mongodb mapreduce函数是否接受文档的计算值作为映射器

时间:2017-09-22 13:05:16

标签: mongodb mongoose mongodb-query

我使用MongoDB版本2.6.10。以下是收集结构。我使用MapReduce函数根据(创建(不包括秒),event_name对用户名进行分组。

{
    "_id" : ObjectId("59c11d79078dc54153c36ee8"),
    "event_name" : "notification",
    "created" : ISODate("2017-09-19T13:36:57.252Z"),
    "sender_name" : "nathan",
    "user_name": "Ragul"",
}
{
    "_id" : ObjectId("59c11d79078dc54153c36eeb"),
    "event_name" : "notification",
    "created" : ISODate("2017-09-19T13:36:57.772Z"),
    "sender_name" : "parmesh",
    "user_name": "Ram",
}
{
    "_id" : ObjectId("59c11d7a078dc54153c36ef0"),
    "event_name" : "notification",
    "created" : ISODate("2017-09-19T13:36:58.554Z"),
    "sender_name" : "nathan",
    "user_name": "Ram",

}
{
    "_id" : ObjectId("59c11d7a078dc54153c36ef1"),
    "event_name" : "message",
    "created" : ISODate("2017-09-19T13:36:58.577Z"),
    "sender_name" : "nathan",
    "user_name": "Ragul"",
}

下面是我使用MapReduce函数的查询。 我的问题是我们是否可以将计算日期用作映射器。帮助我提出建议

var mapfn = function(){
    if (this.event_name == "message"){
        name = this.recipient_name
    }
    else if ((this.event_name == "notification") && (this.other_status == true)){
        name = this.sender_name
    }
    else if ((this.event_name == "notification") && (this.other_status == false)){
        name = "You"
    }
    this.cre = {$subtract:[this.created,{$add:[{$multiply:[{$second:this.created},1000]},{$millisecond:this.created}]}]}
    emit({"event_name": this.event_name, "created": this.cre}, name)
}

var redfun = function(key, value){
    return Array.append(value)
}

db.getCollection('users').mapReduce(mapfn, redfun, {out: "example"}).find()

1 个答案:

答案 0 :(得分:0)

这里使用MongoDB表达式计算日期,我尝试使用javascript来消除秒然后我映射然后它的工作。

var mapfn = function(){
    if (this.event_name == "message"){
        name = this.recipient_name
    }
    else if ((this.event_name == "notification") && (this.other_status == true)){
        name = this.sender_name
    }
    else if ((this.event_name == "notification") && (this.other_status == false)){
        name = "You"
    }
    this.created.setSeconds(0);
    this.created.setMilliseconds(0);
    emit({"event_name": this.event_name, "created": this.created}, name)
}

var redfun = function(key, value){
    var names = value.join(",")
    return names
}

db.users.mapReduce(mapfn, redfun, {out: "example"}).find()