2014-12-05 6 views
1

У меня есть документ Монго, который имеет структуру, подобнуюMongoDB запрашивая Embeded Документ

{ 
"_id" : "THIS_IS_A_DHP_USER_ID+2014-11-26", 
"_class" : "weight", 
"items" : [ 
    { 
     "dateTime" : ISODate("2014-11-26T08:08:38.716Z"), 
     "value" : 98.5 
    }, 
    { 
     "dateTime" : ISODate("2014-11-26T08:18:38.716Z"), 
     "value" : 95.5 
    }, 
    { 
     "dateTime" : ISODate("2014-11-26T08:28:38.663Z"), 
     "value" : 90.5 
    } 
], 
"source" : "MANUAL", 
"to" : ISODate("2014-11-26T08:08:38.716Z"), 
"from" : ISODate("2014-11-26T08:08:38.716Z"), 
"userId" : "THIS_IS_A_DHP_USER_ID", 
"createdDate" : ISODate("2014-11-26T08:38:38.776Z") 
} 
{ 
"_id" : "THIS_IS_A_DHP_USER_ID+2014-11-25", 
"_class" : "weight", 
"items" : [ 
    { 
     "dateTime" : ISODate("2014-11-25T08:08:38.716Z"), 
     "value" : 198.5 
    }, 
    { 
     "dateTime" : ISODate("2014-11-25T08:18:38.716Z"), 
     "value" : 195.5 
    }, 
    { 
     "dateTime" : ISODate("2014-11-25T08:28:38.716Z"), 
     "value" : 190.5 
    } 
], 
"source" : "MANUAL", 
"to" : ISODate("2014-11-25T08:08:38.716Z"), 
"from" : ISODate("2014-11-25T08:08:38.716Z"), 
"userId" : "THIS_IS_A_DHP_USER_ID", 
"createdDate" : ISODate("2014-11-26T08:38:38.893Z") 
} 

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

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

ответ

1

Вы можете агрегировать его, как показано ниже:

  • Initialize переменные даты начала и конца.
  • Match обязательный документ пользователя.
  • Unwind элементы массива.
  • Используйте оператора $and на номер match, где находится дата.
  • Group вместе основано на userId.
  • Project обязательные поля.

Код:

var startDate = ISODate(); // initialize the correct start date 
var endDate = ISODate(); // initialize the correct end date. 

db.collection.aggregate([ 
{$match:{"userId":"THIS_IS_A_DHP_USER_ID"}}, 
{$unwind:"$items"}, 
{$match:{$and:[{"items.dateTime":{$gt:startDate}}, 
       {"items.dateTime":{$lt:endDate}}]}}, 
{$group:{"_id":"$userId", 
     "items":{$push:"$items"}, 
     "_class":{$first:"$_class"}, 
     "source":{$first:"$source"}, 
     "to":{$first:"$to"}, 
     "from":{$first:"$from"}, 
     "createdDate":{$first:"$createdDate"}}}, 
{$project:{"_id":0, 
     "items":1, 
     "_class":1, 
     "source":1, 
     "to":1, 
     "from":1, 
     "createdDate":1,"userId":"$_id"}} 
]) 
Смежные вопросы