2016-01-29 83 views
1

我試圖按月份和年份獲取一組mongo文檔。目前的查詢我的作品:按客戶ID標記客戶ID的唯一記錄,並跟蹤客戶ID的總記錄

var query = Order.aggregate(
     { 
      $project: 
      { 
       cust_ID : '$request.headers.custID', 
       cost : '$request.body.expectedPrice', 
       year : 
       { 
        $year: '$date' 
       }, 
       month: 
       { 
        $month: '$date' 
       } 
      } 
     }, 
     { 
      $match: 
      { 
       year : year, 
       month: month 
      } 
     } 
    ); 

但我也需要聚合/按客戶ID推總訂單,所以我說這查詢的中期階段$project$match之間。該查詢回來,甚至以爲我知道有結果:

 { 
      $group: 
      { 
       "_id": "$request.headers.custID", 
       "custID" : { 
        "$first" : "$request.headers.custID" 
       }, 
       "orders": 
       { 
        "$push": 
        { 
         "order": "$request.body" 
        } 
       } 
      } 
     }, 

我想補充一點聚合push至$項目,但項目$不支持。我該如何編寫這個查詢?

回答

0

既然你已經通過$project管道新的領域,你應該通過他們到一個流水線一步,因爲它們的定義:

var pipeline = [ 
    { 
     "$project": { 
      cust_ID: '$request.headers.custID', 
      "cost": '$request.body.expectedPrice', 
      "year": { "$year": '$date' }, 
      "month": { "$month": '$date' }, 
      "order": "request.body" 
     } 
    }, 
    { 
     "$match": { 
      "year": year, 
      "month": month 
     } 
    }, 
    { 
     "$group": { 
      "_id": "$cust_ID", 
      "custID": { "$first" : "$cust_ID" }, 
      "cost": { "$first" : "$cost" }, 
      "orders": { "$push": "$order" }     
     } 
    }, 
] 

var query = Order.aggregate(pipeline) 
+0

感謝這個!我正在失去「成本」領域。這是因爲我沒有繼續將成本字段從'$ project'輸入到'$ group'中?我發現使用「」,$和「$」等令人困惑。爲什麼'$ project'需要加引號,'$ match'不需要?爲什麼'訂單'在引號中,其餘的字段不是? ('cust_ID','cost'等)?在'$ group'中,爲什麼它是'「order」:「$ order」'?我覺得這很令人困惑 – Growler

+0

我修改了我的答案,通過'$ first'運算符在'$ group'管道中包含'cost'字段。使用'$'字符不應該是令人生畏的,因爲這是mongo如何解釋管道中的文檔字段。除非您使用點符號封裝嵌入字段,否則引號是非常必要的字符串。最後,「orders」這個語句:{「$ push」:{「order」:「$ order」}}'會創建一個文檔數組,例如: '{...,「orders」:[{「order」:「ABC」},{「order」:「XYZ」}],..}'。 – chridam