将包含ISODATE数组的MongoDB文档转换为字符串

将包含ISODATE数组的MongoDB文档转换为字符串,mongodb,aggregation-framework,bson,isodate,Mongodb,Aggregation Framework,Bson,Isodate,我有这种形式的MongoDB文档,其中“疫苗接种”是一系列ISODates: { "vacNo" : 1, "claimantDetails" : { "forename" : "Fry", "surname" : "Gordon", "dateOfBirth" : ISODate("2000-12-31T00:00:00Z") },

我有这种形式的MongoDB文档,其中“疫苗接种”是一系列ISODates:

{        
        "vacNo" : 1,
        "claimantDetails" : {
                "forename" : "Fry",
                "surname" : "Gordon",
                "dateOfBirth" : ISODate("2000-12-31T00:00:00Z")
        },
        "vaccinations" : [
                {
                        "dateOfVaccination" : ISODate("2010-12-31T00:00:00Z"),
                        "Type" : "MMR"
                },
                {
                        "dateOfVaccination" : ISODate("2015-01-31T00:00:00Z"),
                        "Type" : "Flu"
                }
        ]
}
我需要将所有ISODATE转换为字符串,包括“疫苗接种”数组中的ISODATE(保持其他字段不变),如下所示:

{
        "vacNo" : 1,
        "claimantDetails" : {
                "forename" : "Fry",
                "surname" : "Gordon",
                "dateOfBirth" : "2000-12-31"
        },
        "vaccinations" : [
                {
                        "dateOfVaccination" : "2010-12-31",
                        "Type" : "MMR"
                },
                {
                        "dateOfVaccination" : "2015-01-31",
                        "Type" : "Flu"
                }
        ]
}
我可以使用$dateToString,但只能在不属于数组的字段上使用,例如:

db.claimTest.aggregate([{$project:{ _id:0, 
    "vacNo":1, 
    "claimantDetails.forename":1,
    "claimantDetails.surname":1,
    "claimantDetails.dateOfBirth":{ $dateToString:{format:"%Y-%m-%d", date:"$claimantDetails.dateOfBirth"}}}}]);
它将“ClaimentDetails.dateOfBirth”转换为字符串,但我无法转换任何“DateOfVenturement”字段,因为它们是“Ventures”BSON数组的一部分

是否有任何建议/解决方案可以帮助将ISODate文档转换为所需文档?


谢谢

您可以使用
$map
修改数组的每个元素。在和的帮助下,以下是解决方案之一

db.claimTest.aggregate([{
    $project: {
        _id: 0,
        "vacNo": 1,
        "claimantDetails.forename": 1,
        "claimantDetails.surname": 1,
        "claimantDetails.dateOfBirth":{ $dateToString:{format:"%Y-%m-%d", date:"$claimantDetails.dateOfBirth"}},
        "vaccinations": {
            $map: {
                input: "$vaccinations",
                as: "v",
                in: {
                    $mergeObjects: [
                        '$$v',
                        {
                            dateOfVaccination: {
                                $dateToString: {
                                    format: "%Y-%m-%d",
                                    date: "$$v.dateOfVaccination"
                                }
                            }
                        }
                    ]
                }
            }
        }
    }
}]);
编辑:已更正的输出


希望这有帮助

感谢您使用$map和$mergeObjectsWellcome to StackOverflow@Mustaq完成了完美的工作。请随意更新他的答案,并检查其是否正确,以便其他人可以找到这一点