2017-04-12 19 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看到我更新的答案 –