The $dateToParts expression operator return a document with "isoYear" and "isoWeekYear" fields that confusingly correspond to the return values of the $isoWeekYear and $isoWeek expression operators, respectively. I think we should change the $dateToParts expression operator to use the field names of "isoWeekYear" and "isoWeek" to match the behavior of the existing $isoWeekYear and $isoWeek expression operators.
Note: We'll want to change $dateFromParts to take the "isoWeekYear" and "isoWeek" field names instead too.
> db.mycoll.aggregate([{$addFields: { parts: {$dateToParts: {date: "$date", iso8601: true}}, isoWeekYear: {$isoWeekYear: "$date"}, isoWeek: {$isoWeek: "$date"}, }}]).toArray() [ { "_id" : ObjectId("59ce4f35ac2831cef80ed375"), "date" : ISODate("2017-09-29T13:48:37.665Z"), "parts" : { "isoYear" : 2017, "isoWeekYear" : 39, "isoDayOfWeek" : 5, "hour" : 13, "minute" : 48, "second" : 37, "millisecond" : 665 }, "isoWeekYear" : NumberLong(2017), "isoWeek" : 39 } ]