2014-12-05 103 views
1

我有一种结构类似MongoDB的查询嵌入式文件

{ 
"_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") 
} 

希望火在这个文档结构的查询蒙戈文件,是查找文档为特定的用户ID,解开了嵌入式阵列并获取特定日期范围内的对象。

是否可以为这样的查询创建聚合,或者是否需要使用map-reduce类型的查询来解决。

回答

1

可按照下述总IT:

  • Initialize开始日期和结束日期变量。
  • Match所需的userId文件。
  • Unwind items数组。
  • 使用$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"}} 
])