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

时间:2019-01-14 13:33:39

标签: mongodb aggregation-framework bson isodate

我有这种形式的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转换为字符串,包括如下所示的“疫苗接种”数组中的那些(保持其他字段不变):

{
        "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"}}}}]);

它将“ claimantDetails.dateOfBirth”转换为字符串,但是我无法转换任何“ dateOfVaccination”字段,因为它们是“疫苗” BSON数组的一部分。

有人对将ISODate文档转换为所需文档有任何建议/解决方案吗?

谢谢

1 个答案:

答案 0 :(得分:1)

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

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"
                                }
                            }
                        }
                    ]
                }
            }
        }
    }
}]);

编辑:更正后的输出

希望这会有所帮助!