2013-05-02 3 views
0

У меня есть коллекция в MongoDB в этом форматеMongoDB: сбор запросов на основе даты

db.logins.find().pretty() 
{ 
     "cust_id" : "samueal", 
     "created_at" : "2011-03-09 10:31:02.765" 
} 
{ 
     "cust_id" : "sade", 
     "created_at" : "2011-03-09 10:33:11.157" 
} 
{ 
     "cust_id" : "sade", 
     "created_at" : "2011-03-10 10:33:35.595" 
} 
{ 
     "cust_id" : "samueal", 
     "created_at" : "2011-03-10 10:39:06.388" 
} 

Это моя MapReduce функция

m = function() { emit(this.cust_id, 1); } 


    r = function (k, vals) { var sum = 0; for (var i in vals) { sum += vals[i]; } return sum; } 


    q = function() { 
     var currentDate = new Date(); 
     currentDate.setDate(currentDate.getDate()-32); 
     var month = (currentDate.getMonth() < 10 ? "0"+ (currentDate.getMonth()+1) : (currentDate.getMonth()+1)); 
     var date = currentDate.getFullYear() + "-" + month ; 
     var patt = new RegExp(date); 
     var query = {"created_at":patt}; 
     return query; 
    } 


    res = db.logins.mapReduce(m, r, { query : q(), out : "userLoginCountMonthly" }); 

С этим я адресности выход в

{ "_id" : "sade", "value" : 2 } 
{ "_id" : "samueal", "value" : 2 } 

, но мне нужен генной отчет о выходе в этом формате

Для примера

Name   Date    Logins 

sade   2011-03-09  1 
sade   2011-03-10  2 
samueal  2011-03-09  1 
samueal  2011-03-10  1  

Может кто-нибудь, пожалуйста, помогите мне, как для того чтобы достигнуть, его

Отредактировано Часть

В настоящее время я получаю выход как

{ "_id" : "dsstest 2011-03-09", "value" : 4 } 
    { "_id" : "dsstest 2011-03-10", "value" : 14 } 

Возможно ли, что я могут получить в этом формате

{ "_id" : "dsstest" , "date" : "2011-03-09", "value" : 4 } 
{ "_id" : "dsstest" , "date" : "2011-03-10", "value" : 14 } 

ответ

1

Ваша функция отображения недостаточна, так как она не создает ключ, в котором есть дата. Я также не совсем понимаю, почему в образце того, что вы хотите sade получает два входа. Из того, что вы говорите, вы хотите, если вам нужно:

var m = function() { 
    var aux = this.created_at.indexOf(' '); 
    aux = this.created_at.substring(0,aux); 

    // this 'if' block will filter out the entries you don't want 
    // to be included in the result. 
    if (aux < "2011-11-11") { 
     return; 
    } 
    emit({cust:this.cust_id,day:aux},1); 
} 
var r = function(k, values) { 
    var l = values.length; 
    var r = 0; 
    var i; 
    for (i=0; i<l; i++) { 
    r+=values[i]; 
    } 
    return r; 
} 

И бежать:

> db.logins.mapReduce(m, r, { query : q(), out : "userLoginCountMonthly" }); 

И, наконец, для создания отчета:

> db.userLoginCountMonthly.find().forEach(function(e){print(e._id.cust +' ' + e._id.day+' '+e.value);}) 

Этот список сумму логинов для каждого пользователя, за каждый день (в пределах области поиска).

+0

Я пытаюсь изменить свой запрос, чтобы он возвращал все данные из коллекции, если он меньше, чем вчера, но при этом дает ошибку, см. Отредактированную часть. – user974802

+0

Хранение дат как строк в базе данных - это не лучший способ, так как это действительно мешает делать то, что вы хотите. Если все, что вы хотите, просто не включать сегодня в результаты, вам лучше просто игнорировать сегодняшнюю дату в финальном отчете или изменить ваши функции карты. Я обновил свой ответ. –

+0

Не могу я использовать внутренний запрос как var query = {created_at: {$ lt: "2011-11-11"}} – user974802

Смежные вопросы