2017-09-22 1 views
3

J'utilise MongoDB version 2.6.10. Voici la structure de collecte. J'utilise la fonction MapReduce pour regrouper les noms de l'utilisateur en fonction (créé (sauf secondes), event_name.si la fonction mongodb mapreduce accepte la valeur calculée du document en tant que mappeur

{ 
    "_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"", 
} 

Ci-dessous est ma requête en utilisant la fonction MapReduce. Ma question est de savoir si nous pouvons utiliser la date calculée en mappeur. Aidez-moi vos suggestions

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() 

Répondre

0

ici au lieu calculer la date en utilisant l'expression MongoDB, je essayé d'utiliser javascript pour éliminer les secondes puis je cartographié alors son travaillé.

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()