2015-09-09 2 views
0

Im пытается получить количество определенных элементов, сгруппированных по определенным датам. Это работает, используя следующий совокупный запрос:Можно ли использовать агрегированный запрос MongoDB с совпадением даты?

// this query works, without matching dates 
[ 
    {'$match': { 
    'some_id': ObjectId('foobar'), 
    'some_boolean_value': true 
    } 
    }, 
    {'$project': 
    {'day': 
     {'$substr': ['$some_date', 0, 10]}} 
    }, 
    {'$group': {_id: '$day', count: { '$sum': 1 }}}, 
    {'$sort': {_id: -1}} 
] 

Следующий шаг состоит в том, что я хочу использовать этот запрос, но с датой ограничений. Я хочу подсчет, сгруппированный в день, между определенными лимитами.

// the query below does not work as soon as date matching is added 
// this query always return 0 documents 
[ 
    {'$match': { 
    'some_id': ObjectId('foobar'), 
    'some_boolean_value': true, 
    'some_date': 
     { 
     '$gte': '2015-08-01T00:00:00.000Z', 
     '$lte': '2015-08-31T23:59:59.999Z' 
     } 
    } 
    }, 
    {'$project': 
    {'day': 
     {'$substr': ['$some_date', 0, 10]}} 
    }, 
    {'$group': {_id: '$day', count: { '$sum': 1 }}}, 
    {'$sort': {_id: -1}} 
] 
+0

Вы используете "ниточки". В ваших документах содержатся «строки» или они содержат объекты «Дата». –

+0

@BlakesSeven Они содержат объекты Date, я просто заполнил их фактическими датами в качестве примера. –

+0

Тогда вы не используете '$ substr' то, что не является« строкой ». Это должно быть довольно ясно. –

ответ

0

Вы хотите фильтровать документы и сопоставлять только те, которые указаны в указанном окне даты и времени. Но вместо сравнения даты вы используете сравнение строк.

Поэтому заменить это:

'$gte': '2015-08-01T00:00:00.000Z', 
'$lte': '2015-08-31T23:59:59.999Z' 

с этим:

'$gte': new Date('2015-08-01T00:00:00.000Z'), 
'$lte': new Date('2015-08-31T23:59:59.999Z') 
Смежные вопросы