2014-12-05 158 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"}} 
])