【问题标题】:Converting MongoDB documents containing arrays of ISODates to Strings将包含 ISODates 数组的 MongoDB 文档转换为字符串
【发布时间】:2019-01-14 13:33:38
【问题描述】:

我有这种形式的 MongoDB 文档,其中“vaccinations”是一个 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"
                }
        ]
}

我需要将所有 ISODates 转换为字符串,包括“vaccinations”数组中的那些(保持其他字段不变),如下所示:

{
        "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”字段,因为它们是“vaccinations”BSON 数组的一部分。

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

谢谢

【问题讨论】:

    标签: mongodb aggregation-framework bson isodate


    【解决方案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"
                                    }
                                }
                            }
                        ]
                    }
                }
            }
        }
    }]);
    

    编辑:更正输出

    希望这会有所帮助!

    【讨论】:

    • 感谢使用 $map 和 $mergeObjects 完美工作
    • 欢迎来到 StackOverflow @Mustaq。随意投票他的答案并检查它是否正确,以便其他人可以找到这个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多