2017-04-12 20 views
3

$ COND檢查這是我的文檔的集合操作,如何做在同一陣列中的空值,而分組

{ 
    "_id": "58aecaa3758fbff4176db088", 
    "actualEndDate": "2017-02-27T00:00:00.000Z", 
    "Details": [ 
    {   
     "projectId": "58a585f6758fbff4176dadb9", 
    } 
    ] 
}, 
{ 
    "_id": "58aecac8758fbff4176db08b", 
    "actualEndDate": "2017-03-12T00:00:00.000Z", 
    "Details": [ 
    {   
     "projectId": "58a585f6758fbff4176dadb9", 
    } 
    ] 
}, 
{ 
    "_id": "58aecac8758fbff4176db08c", 
    "actualEndDate": null, 
    "Details": [ 
    {   
     "projectId": "58a585f6758fbff4176dadb9", 
    } 
    ] 
} 

我需要一羣這些和我的查詢中,我需要找到$max「僅當所有「actualEndDate」字段不爲空時,才使用條件「actualEndDate」。

我想是這樣的,

{ 
    $group: 
      { 
       _id: '$Details.projectId', 
       actualEndDate: 
        { 
        $cond: { 
          if: { $ne: [ $actualEndDate, null] }, 
          then: $actualEndDate, else: null 
          } 
        } 
      } 
} 

,這樣我可以得到像

{ 
    "projectId": "58a585f6758fbff4176dadb9", 
    "actualEndDate": null, 
} 

預期的結果如果樣品不含{ "_id": "58aecac8758fbff4176db08c" }記錄,那麼我希望得到的結果有actualEndDate作爲最大的其他兩個文件

{ 
    "projectId": "58a585f6758fbff4176dadb9", 
    "actualEndDate": "2017-03-12T00:00:00.000Z", 
} 

任何他lp表示讚賞。

回答

3

您可以$sortactualDate場,$unwindDetails數組,然後$group只服用了$first日期將確保這是最近的日期:

db.data.aggregate([{ 
    $sort: { 
     "actualEndDate": -1 
    } 
}, { 
    $unwind: "$Details" 
}, { 
    $group: { 
     _id: "$Details.projectId", 
     actualEndDate: { 
      $first: "$actualEndDate" 
     } 
    } 
}]); 

如果你想如果至少返回一個空date一個日期爲null指定的projectId以下將做的工作:

db.data.aggregate([{ 
    $sort: { 
     "actualEndDate": -1 
    } 
}, { 
    $unwind: "$Details" 
}, { 
    $group: { 
     _id: "$Details.projectId", 
     dates: { 
      $push: "$actualEndDate" 
     } 
    } 
}, { 
    $project: { 
     projectId: "$_id", 
     actualEndDate: { 
      $cond: { 
       if: { 
        $setIsSubset: [ 
         [null], "$dates" 
        ] 
       }, 
       then: null, 
       else: { $arrayElemAt: ["$dates", 0] } 
      } 
     } 
    } 
}]); 

的想法是到$push所有的日期到一個新的陣列,並投影到返回nullnull被發現在陣列內,否則返回數組的第一個元素(在第一階段排序的值)

+0

嗨這裏的數組進行排序,$ first會給出日期,因爲空值在排序後的日期之後。 – arunraj414

+0

如果有「actualEndDate」爲空,我需要null作爲「actualEndDate」 – arunraj414

+0

@ arunraj414看到我更新的答案 –