2016-09-11 2 views
1

У меня есть следующий объект:MongoDB: операция Матч с DAYOFWEEK фильтром

{ 
    ... 
    "junctionId" : "6301", 
    "ts" : ISODate("2016-08-10T11:17:47.000Z") 
    ... 
} 

Я хочу, чтобы фильтровать документы, которые не имеют метки времени определенный день недели.

Я могу это следующим образом:

db.getCollection('phasedata-test').aggregate([ 
{ $match : { 
    ts : { $gte : ISODate('2016-08-18T21:00:00.000Z'), $lte: ISODate('2016-08-25T21:30:00.000Z') }, 
    junctionId : { $eq : "6301"}} 
}, 
{ 
    $sort: {ts : 1} 
}, 

{ "$group": { 
    "_id": { 
     "year": { "$year": "$ts" }, 
     "month": { "$month": "$ts" }, 
     "day": { "$dayOfMonth": "$ts" }, 
     "hour": { "$hour": "$ts" }, 
     "interval": { 
      "$subtract": [ 
       { "$minute": "$ts" }, 
       { "$mod": [{ "$minute": "$ts"}, 15 ] } 
      ] 
     } 
    }, 
    "dayOfWeek": { "$first": { "$dayOfWeek": "$ts" }}, 
    } 
}, 

{ $match :{ 
    "dayOfWeek" : { $eq : 5}} 
} 

Пожалуйста, не смотрите на id grouping. Это необходимо для моего запроса.

Количество документов может быть большим, поэтому я хочу уменьшить количество документов для обработки. Как я могу использовать день недели фильтр в операция первого совпадения?

Что касается

ответ

0

Самое мощное решение будет самым простым: добавить поле dayOfWeek ваш базовый документ.

создать индекс на нем ... и все работает отлично :-)

=================

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

+0

Да, это решение было бы каким-то изящным, но объектная модель уже разработана и код также написан, поэтому мне не нужно так много менять :-). – nurgasemetey

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