2012-01-07 4 views
0

В MongoDB У меня есть набор документов, называемых «клиентами», где каждый документ структурирован примерно следующим образом. Обратите внимание, что TimeStamp является DateTime:Запрос документов по полям в массиве

{ 
    "Sessions": [ 
    { 
     "SessionId": "pojiu5iprr2xw5ucsudyrkpv", 
     "LocationId": { 
     "$oid": "4de4590bfcee1a1b44165e2b" 
     }, 
     "Timestamp": "Wed, 01 Jun 2011 09:39:26 GMT -04:00" 
    } 
    ], 
    "_id": { 
    "$oid": "4de6410efcee1a1204a3326c" 
    } 
} 

Я хотел бы иметь возможность запросить «всех клиентов, которые имеют по крайней мере один сеанс с меткой времени в течение последних 24 часов». Возможно ли это, не прибегая к полной проверке M/R? Я также буду принимать ответы со статистически определенной датой, например. «все клиенты, у которых есть хотя бы один сеанс с отметкой времени более чем 1/5/2012»

ответ

1

Как насчет добавления поля в основной документ для «последнего сеанса».

Обновлено: Хорошо, вот как вы можете сделать это без добавления нового поля/индекс:

db.clients.find(
    { "Sessions" : 
     { $elemMatch : 
     { Timestamp : { $gt : new Date(new Date() - 86400000) } } 
     } 
    } 
); 

же код на одной строке:

db.clients.find({ "Sessions" : { $elemMatch : { Timestamp : { $gt : new Date(new Date() - 86400000) } } } }); 

86400000 это число миллисекунд в день.

+0

Это мой план резервного копирования. Я бы предпочел не дублировать данные. –

+0

Подумайте об этом как о способе индексирования. Это все индексы, на самом деле - дублированные данные. –

+0

Несомненно. Я просто хочу держаться подальше от бизнеса по написанию индексов, если смогу. –

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